// =============================================================================
// HeadlineSift.com — Ranking Rules Admin Page
// =============================================================================
import type { Metadata } from "next";
import { prisma } from "@/lib/db/client";
import { RankingRulesPageClient } from "./RankingRulesPageClient";
import type { RankingRuleRow } from "./RankingRuleTable";

export const metadata: Metadata = { title: "Ranking Rules" };

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

function successMessage(key: string): string | null {
  const messages: Record<string, string> = {
    created: "Ranking rule created.",
    updated: "Ranking rule updated.",
    deleted: "Ranking rule deleted.",
    activated: "Rule activated — it will be used for ranking.",
    deactivated: "Rule deactivated — it will be skipped.",
  };
  return messages[key] ?? null;
}

export default async function RankingRulesPage({ searchParams }: Props) {
  const params = await searchParams;
  const editId = params.edit ?? null;
  const successKey = params.success ?? null;
  const errorKey = params.error ?? null;
  const categoryFilter = params.category ?? null;
  const statusFilter = params.status ?? null;

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

  const where: Record<string, unknown> = {};
  if (categoryFilter) where.categoryId = categoryFilter;
  if (statusFilter && ["ACTIVE", "INACTIVE", "DRAFT"].includes(statusFilter)) where.status = statusFilter;

  const rules = await prisma.rankingRule.findMany({
    where: where as any,
    orderBy: [{ category: { name: "asc" } }, { country: { name: "asc" } }],
    include: {
      category: { select: { id: true, name: true, slug: true } },
      country: { select: { id: true, name: true, code: true } },
    },
  });

  const rows: RankingRuleRow[] = rules.map((r) => ({
    id: r.id,
    categoryId: r.categoryId,
    categoryName: r.category.name,
    categorySlug: r.category.slug,
    countryId: r.countryId,
    countryName: r.country?.name ?? null,
    countryCode: r.country?.code ?? null,
    freshnessWeight: r.freshnessWeight,
    sourceTrustWeight: r.sourceTrustWeight,
    sourceCountWeight: r.sourceCountWeight,
    officialSourceBoost: r.officialSourceBoost,
    impactWeight: r.impactWeight,
    duplicatePenalty: r.duplicatePenalty,
    lowConfidencePenalty: r.lowConfidencePenalty,
    clickbaitPenalty: r.clickbaitPenalty,
    maxStories: r.maxStories,
    status: r.status,
  }));

  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, code: true }, orderBy: { name: "asc" } }),
  ]);

  const editRule = editId
    ? await prisma.rankingRule.findUnique({ where: { id: editId }, select: { id: true, categoryId: true, countryId: true, freshnessWeight: true, sourceTrustWeight: true, sourceCountWeight: true, officialSourceBoost: true, impactWeight: true, duplicatePenalty: true, lowConfidencePenalty: true, clickbaitPenalty: true, maxStories: true, status: true } })
    : null;

  const editRuleData = editRule ? { ...editRule } : null;

  return (
    <RankingRulesPageClient
      rules={rows}
      categoryFilter={categoryFilter}
      statusFilter={statusFilter}
      categories={categories.map((c) => ({ id: c.id, name: c.name }))}
      countries={countries.map((c) => ({ id: c.id, name: c.name, code: c.code }))}
      editRule={editRuleData}
      successMsg={successMsg}
      errorMsg={errorMsg}
    />
  );
}
