import { notFound } from "next/navigation";
import { ManagedPageList } from "@/components/features/managed-page-list";
import { Card, EmptyState, PageHeader, Pagination } from "@/components/ui";
import { canAnywhere, type DashboardKind } from "@/lib/authz/context";
import { requireDashboard } from "@/lib/authz/guard";
import { PAGE_SIZE } from "@/components/ui/pagination";
import { PAGE_STATUSES } from "@/lib/domain/enums";
import { listAccessibleSites, getActiveSiteId } from "@/lib/data/sites";
import { requireSiteModule } from "@/lib/data/modules";
import { listPages } from "@/lib/data/lists";
import { buildHref, parseListParams } from "@/lib/list-params";

export async function PagesScreen({ kind, searchParams }: { kind: Extract<DashboardKind, "admin" | "editor">; searchParams: Promise<Record<string, string | string[] | undefined>> }) {
  const ctx = await requireDashboard(kind);
  if (!canAnywhere(ctx, "pages.read")) notFound();
  const base = `/dashboard/${kind}`;
  const path = `${base}/pages`;
  const { q, status, page } = parseListParams(await searchParams, PAGE_STATUSES);
  const sites = await listAccessibleSites(ctx);
  const siteId = await getActiveSiteId(sites);
  // Pages always belong to one website: nothing from the organisation's other websites is mixed in.
  if (!siteId) return (<><PageHeader title="Pages" /><Card><EmptyState title="Choose a website" description="Open a website first (Edit in your website list, or the top-bar dropdown) to manage its pages." /></Card></>);
  await requireSiteModule(ctx, siteId, "pages");
  const { rows, total } = await listPages(ctx, { q, status, page, siteId });
  const canCreate = canAnywhere(ctx, "pages.create");
  const canEdit = canAnywhere(ctx, "pages.edit");
  const canPublish = canAnywhere(ctx, "pages.publish");
  const reorderable = Boolean(siteId) && !q && !status && total <= PAGE_SIZE;

  return (
    <div className="ed -m-4 min-h-[calc(100vh-3.5rem)] space-y-8 p-4 sm:-m-6 sm:p-8">
      <ManagedPageList key={rows.map((r) => r.id).join()} pages={rows} base={path} siteId={siteId ?? null} canReorder={canEdit && reorderable} canCopy={canCreate} canCreate={canCreate} canEdit={canEdit} canPublish={canPublish} q={q} status={status} />
      <Pagination page={page} total={total} buildHref={(p) => buildHref(path, { q, status, page: p })} />
    </div>
  );
}
