import 'server-only';

import type { PublicTopPicksResponseV1 } from '@/contracts/forecast-public';
import type { EventSportsApiResponse, EventsApiResponse } from '@/lib/api';

const API_URL = process.env.INTERNAL_API_URL || 'http://127.0.0.1:3021';

async function fetchJson<T>(path: string, revalidate: number): Promise<T | null> {
  try {
    const response = await fetch(`${API_URL}${path}`, {
      next: { revalidate },
    });

    if (!response.ok) {
      return null;
    }

    return (await response.json()) as T;
  } catch {
    return null;
  }
}

export async function fetchEventsData(league?: string): Promise<EventsApiResponse> {
  const params = new URLSearchParams();
  if (league) params.set('league', league);

  const data = await fetchJson<EventsApiResponse>(
    `/api/events${params.toString() ? `?${params.toString()}` : ''}`,
    300,
  );

  return data ?? {
    leagues: [],
    events: {},
    totalEvents: 0,
  };
}

export async function fetchEventSportsData(): Promise<EventSportsApiResponse> {
  const data = await fetchJson<EventSportsApiResponse>('/api/events/sports', 300);

  return data ?? {
    sports: [],
    total: 0,
  };
}

export async function fetchTopPicksData(
  league?: string,
  limit = 12,
): Promise<PublicTopPicksResponseV1 | null> {
  const params = new URLSearchParams();
  if (league) params.set('league', league);
  params.set('limit', String(limit));

  return fetchJson<PublicTopPicksResponseV1>(
    `/api/forecast/top-picks?${params.toString()}`,
    60,
  );
}

export async function fetchModelStats(): Promise<any | null> {
  return fetchJson('/api/stats/model', 300);
}

export async function fetchClvStats(): Promise<any | null> {
  return fetchJson('/api/stats/clv', 300);
}

export async function fetchClvRecent(): Promise<any | null> {
  return fetchJson('/api/stats/clv/recent', 300);
}

export async function fetchKpiStats(): Promise<any | null> {
  return fetchJson('/api/stats/kpi', 300);
}

export async function fetchPerformanceData(options: {
  window?: number;
  page?: number;
  limit?: number;
  tier?: string;
  league?: string;
  kind?: 'all' | 'props' | 'games';
} = {}): Promise<any | null> {
  const params = new URLSearchParams();
  if (options.window) params.set('window', String(options.window));
  if (options.page) params.set('page', String(options.page));
  if (options.limit) params.set('limit', String(options.limit));
  if (options.tier) params.set('tier', options.tier);
  if (options.league) params.set('league', options.league);
  if (options.kind) params.set('kind', options.kind);

  const query = params.toString();
  return fetchJson(`/api/stats/performance${query ? `?${query}` : ''}`, 300);
}

export async function fetchUpcomingForecasts(): Promise<any | null> {
  return fetchJson('/api/stats/upcoming', 300);
}
