// =============================================================================
// HeadlineSift.com — Categories Admin Page
// =============================================================================
// Server component — queries Prisma, reads searchParams, renders the CRUD UI.

import type { Metadata } from "next";
import { prisma } from "@/lib/db/client";
import { CategoriesPageClient } from "./CategoriesPageClient";
import type { CategoryRow } from "./CategoryTable";

export const metadata: Metadata = { title: "Categories" };

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

interface CategoriesPageProps {
  searchParams: Promise<{
    search?: string;
    level?: string;
    edit?: string;
    success?: string;
    error?: string;
  }>;
}

function successMessage(key: string): string | null {
  const messages: Record<string, string> = {
    created: "Category created successfully.",
    updated: "Category updated successfully.",
    deleted: "Category deleted successfully.",
    activated: "Category activated — it will appear in filters and assignments.",
    deactivated: "Category deactivated — it will be hidden from filters and assignments.",
  };
  return messages[key] ?? null;
}

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

export default async function CategoriesPage({ searchParams }: CategoriesPageProps) {
  const params = await searchParams;
  const search = params.search?.trim() ?? "";
  const levelFilter = params.level ?? "";
  const editId = params.edit ?? null;
  const successKey = params.success ?? null;
  const errorKey = params.error ?? null;

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

  // Build where clause
  const conditions: Record<string, unknown>[] = [];
  if (search) {
    conditions.push({
      OR: [
        { name: { contains: search } },
        { slug: { contains: search } },
      ],
    });
  }
  if (levelFilter) {
    conditions.push({ level: levelFilter });
  }

  const where =
    conditions.length > 0 ? { AND: conditions } : {};

  const categories = await prisma.category.findMany({
    where,
    orderBy: [{ displayOrder: "asc" }, { name: "asc" }],
    select: {
      id: true,
      name: true,
      slug: true,
      level: true,
      description: true,
      aiSafetyLevel: true,
      maxPublicStories: true,
      status: true,
      displayOrder: true,
      createdAt: true,
    },
  });

  // Resolve dependent counts
  const categoriesWithDependents: CategoryRow[] = await Promise.all(
    categories.map(async (c) => {
      const [
        sourceMappingCount,
        rawArticleCount,
        storyClusterCount,
        rankingRuleCount,
      ] = await Promise.all([
        prisma.sourceMapping.count({ where: { categoryId: c.id } }),
        prisma.rawArticle.count({ where: { categoryId: c.id } }),
        prisma.storyCluster.count({ where: { categoryId: c.id } }),
        prisma.rankingRule.count({ where: { categoryId: c.id } }),
      ]);

      return {
        ...c,
        dependentCount:
          sourceMappingCount + rawArticleCount + storyClusterCount + rankingRuleCount,
      };
    }),
  );

  // Resolve edit category
  const editCategory = editId
    ? await prisma.category.findUnique({
        where: { id: editId },
        select: {
          id: true,
          name: true,
          slug: true,
          level: true,
          description: true,
          aiSafetyLevel: true,
          maxPublicStories: true,
          status: true,
          displayOrder: true,
        },
      })
    : null;

  const editCategoryData = editCategory
    ? {
        id: editCategory.id,
        name: editCategory.name,
        slug: editCategory.slug,
        level: editCategory.level,
        description: editCategory.description,
        aiSafetyLevel: editCategory.aiSafetyLevel,
        maxPublicStories: editCategory.maxPublicStories,
        status: editCategory.status,
        displayOrder: editCategory.displayOrder,
      }
    : null;

  return (
    <CategoriesPageClient
      categories={categoriesWithDependents}
      searchQuery={search}
      levelFilter={levelFilter}
      editCategory={editCategoryData}
      successMsg={successMsg}
      errorMsg={errorMsg}
    />
  );
}
