import type { Metadata } from "next";
import { notFound } from "next/navigation";
import { FilterBar, TicketList } from "@/components/features";
import { NewTicket } from "@/components/features/tickets";
import { Card, PageHeader, Pagination } from "@/components/ui";
import { canAnywhere } from "@/lib/authz/context";
import { requireDashboard } from "@/lib/authz/guard";
import { TICKET_STATUSES } from "@/lib/domain/enums";
import { listAccessibleSites, getActiveSiteId } from "@/lib/data/sites";
import { listTickets } from "@/lib/data/lists";
import { buildHref, parseListParams } from "@/lib/list-params";

export const metadata: Metadata = { title: "Tickets" };
export const dynamic = "force-dynamic";

const PATH = "/dashboard/tickets";

export default async function TicketsPage({ searchParams }: { searchParams: Promise<Record<string, string | string[] | undefined>> }) {
  const ctx = await requireDashboard("admin");
  if (!canAnywhere(ctx, "maintenance.tickets.read")) notFound();
  const { q, status, page } = parseListParams(await searchParams, TICKET_STATUSES);
  const siteId = await getActiveSiteId(await listAccessibleSites(ctx));
  const { rows, total } = await listTickets(ctx, { q, status, page, siteId });

  const canCreate = Boolean(siteId) && canAnywhere(ctx, "maintenance.tickets.create"); // UI hint only; the service re-checks per site
  return (
    <>
      <PageHeader title="Tickets" description={siteId ? "Showing the selected site." : "Showing every site you can access."} />
      {canCreate && siteId ? <div className="mb-4"><NewTicket base="/dashboard/admin" siteId={siteId} /></div> : null}
      <Card>
        <FilterBar action={PATH} q={q} status={status} statuses={TICKET_STATUSES} placeholder="Search subject" />
        <TicketList hrefBase="/dashboard/tickets" tickets={rows} emptyTitle="No tickets match" />
        <Pagination page={page} total={total} buildHref={(p) => buildHref(PATH, { q, status, page: p })} />
      </Card>
    </>
  );
}
