import 'server-only';

import {
  createEmptyRainWireNewsSeed,
  type RainWireHeadline,
  type RainWireNewsSeed,
  type RainWirePagination,
  type RainWireSportSummary,
} from '@/lib/rainwire-feed';

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

interface HeadlinesResponse {
  headlines?: RainWireHeadline[];
  pagination?: Partial<RainWirePagination>;
}

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 fetchRainWireNewsSeed(options: {
  filter?: 'all' | 'news';
  sport?: string;
  page?: number;
} = {}): Promise<RainWireNewsSeed> {
  const filter = options.filter ?? 'news';
  const sport = options.sport ?? '';
  const page = options.page ?? 1;
  const seed = createEmptyRainWireNewsSeed({ filter, sport, page });
  const params = new URLSearchParams();

  if (sport) params.set('sport', sport);
  params.set('page', String(page));
  params.set('limit', '60');

  const [headlineData, trendingData, sportsData, curatedData] = await Promise.all([
    fetchJson<HeadlinesResponse>(`/api/news/headlines?${params.toString()}`, 300),
    page === 1 ? fetchJson<RainWireHeadline[]>('/api/news/trending', 300) : Promise.resolve(null),
    fetchJson<RainWireSportSummary[]>('/api/news/sports', 300),
    page === 1 ? fetchJson<RainWireHeadline[]>('/api/news/curated?limit=10', 300) : Promise.resolve(null),
  ]);

  const headlines = Array.isArray(headlineData?.headlines) ? headlineData.headlines : [];
  const pagination = headlineData?.pagination ?? {};

  return {
    filter,
    sport,
    page,
    headlines,
    trending: Array.isArray(trendingData) ? trendingData : seed.trending,
    curated: Array.isArray(curatedData) ? curatedData : seed.curated,
    sports: Array.isArray(sportsData) ? sportsData : seed.sports,
    pagination: {
      page: typeof pagination.page === 'number' ? pagination.page : page,
      pages: typeof pagination.pages === 'number' ? pagination.pages : 1,
      total: typeof pagination.total === 'number' ? pagination.total : headlines.length,
    },
  };
}
