import { DailyTrendResponseSchema, StrategyPerformanceResponseSchema, SubredditPerformanceResponseSchema, SuccessfulExamplesResponseSchema, FunnelResponseSchema, AiUsageSummaryResponseSchema, } from '../../../../../packages/api-contracts/src/index.js'; import type { z } from 'zod'; import { createDashboardRequest } from '../../api/request.js'; type SubredditPerformanceResponse = z.infer; type StrategyPerformanceResponse = z.infer; type DailyTrendResponse = z.infer; type SuccessfulExamplesResponse = z.infer; type FunnelResponse = z.infer; type AiUsageSummaryResponse = z.infer; async function parseResponse( response: Response, schema: { parse(value: unknown): T }, ): Promise { const payload: unknown = await response.json(); if (!response.ok) { const message = typeof payload === 'object' && payload !== null && 'error' in payload && typeof payload.error === 'string' ? payload.error : `Request failed (${response.status})`; throw new Error(message); } return schema.parse(payload); } export interface PerformanceApi { getSubredditPerformance(): Promise; getStrategyPerformance(): Promise; getDailyTrend(days: number): Promise; getSuccessfulExamples(): Promise; getFunnel(): Promise; getAiUsage(days: number): Promise; } export function createPerformanceApi( fetchImplementation?: typeof fetch, ) { const request = createDashboardRequest(fetchImplementation); return { async getSubredditPerformance() { return parseResponse( await request('/api/analytics/by-subreddit'), SubredditPerformanceResponseSchema, ); }, async getStrategyPerformance() { return parseResponse( await request('/api/analytics/by-strategy'), StrategyPerformanceResponseSchema, ); }, async getDailyTrend(days: number) { return parseResponse( await request(`/api/analytics/trend?days=${days}`), DailyTrendResponseSchema, ); }, async getSuccessfulExamples() { return parseResponse( await request('/api/successful'), SuccessfulExamplesResponseSchema, ); }, async getFunnel() { return parseResponse( await request('/api/analytics/funnel'), FunnelResponseSchema, ); }, async getAiUsage(days: number) { return parseResponse( await request(`/api/analytics/ai-usage?days=${days}`), AiUsageSummaryResponseSchema, ); }, } satisfies PerformanceApi; } export const performanceApi = createPerformanceApi();