// =============================================================================
// HeadlineSift.com — Raw Articles Admin Page
// =============================================================================
// Server component — lists fetched raw articles with search, source/country/
// category/status/date filters, pagination, and hide/reject actions.

import type { Metadata } from "next";
import { prisma } from "@/lib/db/client";
import { RawArticlesPageClient } from "./RawArticlesPageClient";
import type { RawArticleRow } from "./RawArticleTable";

export const metadata: Metadata = { title: "Raw Articles" };

// ============================================================================
// Types
// ============================================================================

interface RawArticlesPageProps {
  searchParams: Promise<{
    search?: string;
    source?: string;
    country?: string;
    category?: string;
    status?: string;
    startDate?: string;
    endDate?: string;
    success?: string;
    error?: string;
    page?: string;
  }>;
}

const PAGE_SIZE = 50;

const VALID_STATUSES = ["PENDING", "PROCESSED", "SKIPPED", "ERROR"];

// Clean up success/error messages
function successMessage(key: string): string | null {
  const messages: Record<string, string> = {
    hidden: "Article hidden — it will be skipped during clustering.",
    rejected: "Article rejected — it has been marked as ERROR.",
  };
  return messages[key] ?? null;
}

// ============================================================================
// Page
// ============================================================================

export default async function RawArticlesPage({
  searchParams,
}: RawArticlesPageProps) {
  const params = await searchParams;
  const search = params.search?.trim() ?? "";
  const sourceFilter = params.source ?? null;
  const countryFilter = params.country ?? null;
  const categoryFilter = params.category ?? null;
  const statusFilter = params.status ?? null;
  const startDateFilter = params.startDate ?? null;
  const endDateFilter = params.endDate ?? null;
  const successKey = params.success ?? null;
  const errorKey = params.error ?? null;
  const page = Math.max(1, parseInt(params.page ?? "1", 10) || 1);

  // ---- Messages ----
  const successMsg = successKey ? successMessage(successKey) : null;
  const errorMsg = errorKey ? errorKey.replace(/\+/g, " ") : null;

  // ---- Build where clause ----
  const where: Record<string, unknown> = {};

  if (search) {
    where.title = { contains: search };
  }

  if (sourceFilter) {
    where.sourceId = sourceFilter;
  }

  if (countryFilter) {
    where.countryId = countryFilter;
  }

  if (categoryFilter) {
    where.categoryId = categoryFilter;
  }

  if (statusFilter && VALID_STATUSES.includes(statusFilter)) {
    where.status = statusFilter;
  }

  if (startDateFilter || endDateFilter) {
    const publishedAt: Record<string, Date> = {};
    if (startDateFilter) {
      publishedAt.gte = new Date(startDateFilter);
    }
    if (endDateFilter) {
      const end = new Date(endDateFilter);
      end.setHours(23, 59, 59, 999);
      publishedAt.lte = end;
    }
    where.publishedAt = publishedAt;
  }

  // ---- Query articles ----
  const totalCount = await prisma.rawArticle.count({ where: where as any });

  const articles = await prisma.rawArticle.findMany({
    where: where as any,
    orderBy: { fetchedAt: "desc" },
    skip: (page - 1) * PAGE_SIZE,
    take: PAGE_SIZE,
    include: {
      source: { select: { id: true, name: true } },
      country: { select: { id: true, name: true, code: true } },
      category: { select: { id: true, name: true } },
    },
  });

  const articleRows: RawArticleRow[] = articles.map((a) => ({
    id: a.id,
    sourceId: a.sourceId,
    sourceName: a.source.name,
    countryId: a.countryId,
    countryName: a.country?.name ?? null,
    countryCode: a.country?.code ?? null,
    categoryId: a.categoryId,
    categoryName: a.category?.name ?? null,
    title: a.title,
    originalUrl: a.originalUrl,
    author: a.author,
    publishedAt: a.publishedAt,
    fetchedAt: a.fetchedAt,
    status: a.status,
    clustered: a.clustered,
    language: a.language,
    urlHash: a.urlHash,
  }));

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

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

  return (
    <RawArticlesPageClient
      articles={articleRows}
      searchQuery={search}
      sourceFilter={sourceFilter}
      countryFilter={countryFilter}
      categoryFilter={categoryFilter}
      statusFilter={statusFilter}
      startDateFilter={startDateFilter}
      endDateFilter={endDateFilter}
      page={page}
      totalPages={totalPages}
      totalCount={totalCount}
      sourceOptions={sources.map((s) => ({ id: s.id, name: s.name }))}
      countryOptions={countries.map((c) => ({ id: c.id, name: c.name }))}
      categoryOptions={categories.map((c) => ({ id: c.id, name: c.name }))}
      successMsg={successMsg}
      errorMsg={errorMsg}
    />
  );
}
