import { notFound } from "next/navigation";
import { CategoryList } from "@/components/features/categories/category-list";
import { CategoryTree } from "@/components/features/categories/category-tree";
import { Card, EmptyState, PageHeader } from "@/components/ui";
import { canAnywhere, type DashboardKind } from "@/lib/authz/context";
import { requireDashboard } from "@/lib/authz/guard";
import { AuthError } from "@/lib/authz/errors";
import { getActiveSiteId, listAccessibleSites } from "@/lib/data/sites";
import { getCategoryGroup, listCategoryGroups } from "@/lib/services/categories";

const first = (v: string | string[] | undefined) => (Array.isArray(v) ? v[0] : v);

export async function CategoriesScreen({ kind, searchParams }: { kind: Extract<DashboardKind, "admin">; searchParams: Promise<Record<string, string | string[] | undefined>> }) {
  const ctx = await requireDashboard(kind);
  if (!canAnywhere(ctx, "content.manage")) notFound();
  const siteId = await getActiveSiteId(await listAccessibleSites(ctx));
  if (!siteId) return (<><PageHeader title="Categories" /><Card><EmptyState title="Choose a website" description="Open a website first (Edit in your website list, or the top-bar dropdown)." /></Card></>);
  const sp = await searchParams;
  const groupId = first(sp.group)?.slice(0, 40);
  const base = `/dashboard/${kind}/categories`;
  let tree: Awaited<ReturnType<typeof getCategoryGroup>> | null = null;
  let list: Awaited<ReturnType<typeof listCategoryGroups>> | null = null;
  try {
    if (groupId) tree = await getCategoryGroup(siteId, groupId);
    else list = await listCategoryGroups(siteId);
  } catch (e) {
    if (e instanceof AuthError) notFound();
    throw e;
  }
  if (tree) return <CategoryTree siteId={siteId} base={base} group={tree.group} tree={tree.tree} libraries={tree.libraries} languages={tree.languages} initialTab={first(sp.tab) === "assigned" ? "assigned" : "categories"} />;
  return <CategoryList siteId={siteId} base={base} groups={list!.groups} languages={list!.languages} />;
}
