import { queryOptions } from '@tanstack/react-query'; import { getCompanyAiReport, getCompanyAnalysis, getCompanyFinancialStatements, getLatestPortfolioInsight, getPortfolioSummary, getTask, getTaskTimeline, listFilings, listHoldings, listRecentTasks, listResearchJournal, listWatchlist } from '@/lib/api'; import { queryKeys } from '@/lib/query/keys'; import type { FinancialHistoryWindow, FinancialStatementKind } from '@/lib/types'; export function companyAnalysisQueryOptions(ticker: string) { const normalizedTicker = ticker.trim().toUpperCase(); return queryOptions({ queryKey: queryKeys.companyAnalysis(normalizedTicker), queryFn: () => getCompanyAnalysis(normalizedTicker), staleTime: 120_000 }); } export function companyFinancialStatementsQueryOptions(input: { ticker: string; statement: FinancialStatementKind; window: FinancialHistoryWindow; includeDimensions?: boolean; includeFacts?: boolean; factsCursor?: string | null; factsLimit?: number; cursor?: string | null; limit?: number; }) { const normalizedTicker = input.ticker.trim().toUpperCase(); const includeDimensions = input.includeDimensions ?? false; const includeFacts = input.includeFacts ?? false; const factsCursor = input.factsCursor ?? null; const factsLimit = input.factsLimit ?? 500; const cursor = input.cursor ?? null; const limit = input.limit ?? 40; return queryOptions({ queryKey: queryKeys.companyFinancialStatements( normalizedTicker, input.statement, input.window, includeDimensions, includeFacts, factsCursor, factsLimit, cursor, limit ), queryFn: () => getCompanyFinancialStatements({ ticker: normalizedTicker, statement: input.statement, window: input.window, includeDimensions, includeFacts, factsCursor, factsLimit, cursor, limit }), staleTime: 60_000 }); } export function filingsQueryOptions(input: { ticker?: string; limit?: number } = {}) { const normalizedTicker = input.ticker?.trim().toUpperCase() ?? null; const limit = input.limit ?? 120; return queryOptions({ queryKey: queryKeys.filings(normalizedTicker, limit), queryFn: () => listFilings({ ticker: normalizedTicker ?? undefined, limit }), staleTime: 60_000 }); } export function aiReportQueryOptions(accessionNumber: string) { const normalizedAccession = accessionNumber.trim(); return queryOptions({ queryKey: queryKeys.report(normalizedAccession), queryFn: () => getCompanyAiReport(normalizedAccession), staleTime: 300_000 }); } export function watchlistQueryOptions() { return queryOptions({ queryKey: queryKeys.watchlist(), queryFn: () => listWatchlist(), staleTime: 30_000 }); } export function researchJournalQueryOptions(ticker: string) { const normalizedTicker = ticker.trim().toUpperCase(); return queryOptions({ queryKey: queryKeys.researchJournal(normalizedTicker), queryFn: () => listResearchJournal(normalizedTicker), staleTime: 15_000 }); } export function holdingsQueryOptions() { return queryOptions({ queryKey: queryKeys.holdings(), queryFn: () => listHoldings(), staleTime: 30_000 }); } export function portfolioSummaryQueryOptions() { return queryOptions({ queryKey: queryKeys.portfolioSummary(), queryFn: () => getPortfolioSummary(), staleTime: 30_000 }); } export function latestPortfolioInsightQueryOptions() { return queryOptions({ queryKey: queryKeys.latestPortfolioInsight(), queryFn: () => getLatestPortfolioInsight(), staleTime: 30_000 }); } export function taskQueryOptions(taskId: string) { return queryOptions({ queryKey: queryKeys.task(taskId), queryFn: () => getTask(taskId), staleTime: 5_000 }); } export function taskTimelineQueryOptions(taskId: string) { return queryOptions({ queryKey: queryKeys.taskTimeline(taskId), queryFn: () => getTaskTimeline(taskId), staleTime: 5_000 }); } export function recentTasksQueryOptions(limit = 20) { return queryOptions({ queryKey: queryKeys.recentTasks(limit), queryFn: () => listRecentTasks({ limit }), staleTime: 5_000 }); }