// =============================================================================
// HeadlineSift.com — Story Clusters Admin Page
// =============================================================================
import type { Metadata } from "next";
import { prisma } from "@/lib/db/client";
import { StoriesPageClient } from "./StoriesPageClient";
import type { StoryRow } from "./StoryTable";

export const metadata: Metadata = { title: "Story Clusters" };

interface Props {
  searchParams: Promise<{
    status?: string; category?: string; country?: string; page?: string;
    success?: string; error?: string;
  }>;
}

const PAGE_SIZE = 25;
const VALID_STATUSES = ["DRAFT", "NEEDS_REVIEW", "APPROVED", "PUBLISHED", "HIDDEN", "REJECTED"];

export default async function StoriesPage({ searchParams }: Props) {
  const params = await searchParams;
  const statusFilter = params.status ?? null;
  const categoryFilter = params.category ?? null;
  const countryFilter = params.country ?? null;
  const page = Math.max(1, parseInt(params.page ?? "1", 10) || 1);
  const successKey = params.success ?? null;
  const errorKey = params.error ?? null;

  const successMsg = successKey ? decodeURIComponent(successKey) : null;
  const errorMsg = errorKey ? decodeURIComponent(errorKey) : null;

  const where: Record<string, unknown> = {};
  if (statusFilter && VALID_STATUSES.includes(statusFilter)) where.status = statusFilter;
  if (categoryFilter) where.categoryId = categoryFilter;
  if (countryFilter) where.countryId = countryFilter;

  const totalCount = await prisma.storyCluster.count({ where: where as any });

  const clusters = await prisma.storyCluster.findMany({
    where: where as any,
    orderBy: { rankScore: "desc" },
    skip: (page - 1) * PAGE_SIZE,
    take: PAGE_SIZE,
    include: {
      category: { select: { id: true, name: true } },
      country: { select: { id: true, name: true, code: true } },
      _count: { select: { storyArticles: true } },
    },
  });

  const rows: StoryRow[] = clusters.map((c) => ({
    id: c.id,
    canonicalTitle: c.canonicalTitle,
    categoryId: c.categoryId,
    categoryName: c.category?.name ?? null,
    countryId: c.countryId,
    countryName: c.country?.name ?? null,
    countryCode: c.country?.code ?? null,
    firstSeenAt: c.firstSeenAt,
    lastSeenAt: c.lastSeenAt,
    sourceCount: c.sourceCount,
    trustedSourceCount: c.trustedSourceCount,
    officialSourcePresent: c.officialSourcePresent,
    rankScore: c.rankScore,
    impactScore: c.impactScore,
    confidenceScore: c.confidenceScore,
    status: c.status,
    articleCount: c._count.storyArticles,
    createdAt: c.createdAt,
  }));

  const [categories, countries] = await Promise.all([
    prisma.category.findMany({ select: { id: true, name: true }, orderBy: { name: "asc" } }),
    prisma.country.findMany({ select: { id: true, name: true }, orderBy: { name: "asc" } }),
  ]);

  const totalPages = Math.ceil(totalCount / PAGE_SIZE);

  return (
    <StoriesPageClient
      stories={rows}
      statusFilter={statusFilter}
      categoryFilter={categoryFilter}
      countryFilter={countryFilter}
      page={page}
      totalPages={totalPages}
      totalCount={totalCount}
      successMsg={successMsg}
      errorMsg={errorMsg}
      categoryOptions={categories.map((c) => ({ id: c.id, name: c.name }))}
      countryOptions={countries.map((c) => ({ id: c.id, name: c.name }))}
    />
  );
}
