/** فهرست سفارش‌ها با فیلتر وضعیت و جستجو */
import Link from "next/link";
import { z } from "zod";
import { AdminHeader, Card, Empty, Pill, Table } from "@/components/admin/ui";
import { orderStatusFa } from "@/components/admin/labels";
import { db } from "@/lib/db";
import { faDigits, faNumber, formatJalaliShort, formatToman } from "@/lib/format";
import { toLatinDigits } from "@/lib/persian";
import type { Prisma } from "@/generated/prisma/client";
import { requireStaffPage } from "@/server/admin/guard";

export const metadata = { title: "سفارش‌ها" };
export const dynamic = "force-dynamic";

const PAGE = 20;
const params = z.object({
  status: z.enum(["PENDING_PAYMENT", "PAID", "PROCESSING", "SHIPPED", "DELIVERED", "CANCELED"]).optional().catch(undefined),
  q: z.string().trim().max(40).optional().catch(undefined),
  page: z.coerce.number().int().min(1).max(1000).optional().catch(undefined),
});

export default async function AdminOrders({ searchParams }: { searchParams: Promise<Record<string, string | undefined>> }) {
  await requireStaffPage("/admin/orders", "orders");
  const { status, q, page = 1 } = params.parse(await searchParams);
  const query = q ? toLatinDigits(q).toUpperCase() : undefined;
  const where: Prisma.OrderWhereInput = {
    ...(status && { status }),
    ...(query && { OR: [{ code: { contains: query } }, { user: { phone: { contains: query } } }, { phone: { contains: query } }] }),
  };
  const [orders, total, counts] = await Promise.all([
    db.order.findMany({ where, orderBy: { createdAt: "desc" }, skip: (page - 1) * PAGE, take: PAGE, include: { user: { select: { phone: true } }, _count: { select: { items: true } } } }),
    db.order.count({ where }),
    db.order.groupBy({ by: ["status"], _count: { _all: true } }),
  ]);
  const countOf = (s: string) => counts.find((c) => c.status === s)?._count._all ?? 0;
  const href = (p: Record<string, string | number | undefined>) => {
    const sp = new URLSearchParams(Object.entries({ status, q, ...p }).filter(([, v]) => v !== undefined && v !== "") as [string, string][]);
    return `/admin/orders${sp.size ? `?${sp}` : ""}`;
  };

  return (
    <>
      <AdminHeader title="سفارش‌ها" description={`${faNumber(total)} سفارش`} />
      <div className="scrollbar-none mb-4 flex gap-2 overflow-x-auto">
        <Link href={href({ status: undefined, page: undefined })} className={`chip shrink-0 ${!status ? "chip-active" : "bg-paper"}`}>همه</Link>
        {Object.entries(orderStatusFa).map(([s, label]) => (
          <Link key={s} href={href({ status: s, page: undefined })} className={`chip shrink-0 ${status === s ? "chip-active" : "bg-paper"}`}>
            {label} <span className="opacity-60">{faNumber(countOf(s))}</span>
          </Link>
        ))}
      </div>
      <Card>
        <form className="mb-4 flex gap-2">
          {status && <input type="hidden" name="status" value={status} />}
          <input name="q" defaultValue={q} placeholder="شماره سفارش یا موبایل" className="field h-10 max-w-xs" />
          <button className="btn-outline h-10 px-4">جستجو</button>
        </form>
        {orders.length ? (
          <Table head={["سفارش", "تاریخ", "مشتری", "اقلام", "مبلغ", "وضعیت"]}>
            {orders.map((o) => (
              <tr key={o.id} className="hover:bg-mist/60">
                <td><Link href={`/admin/orders/${o.code}`} className="font-bold underline-offset-4 hover:underline"><bdi>{faDigits(o.code)}</bdi></Link></td>
                <td className="text-xs text-muted">{formatJalaliShort(o.createdAt)}</td>
                <td><bdi className="text-xs">{faDigits(o.user.phone)}</bdi></td>
                <td>{faNumber(o._count.items)}</td>
                <td className="whitespace-nowrap">{formatToman(o.total)}</td>
                <td><Pill tone={o.status === "PAID" ? "ink" : o.status === "CANCELED" ? "line" : "mist"}>{orderStatusFa[o.status]}</Pill></td>
              </tr>
            ))}
          </Table>
        ) : (
          <Empty>سفارشی پیدا نشد</Empty>
        )}
        {total > PAGE && (
          <div className="mt-4 flex justify-center gap-2 text-sm">
            {page > 1 && <Link href={href({ page: page - 1 })} className="chip">قبلی</Link>}
            <span className="chip border-0">صفحه {faNumber(page)} از {faNumber(Math.ceil(total / PAGE))}</span>
            {page * PAGE < total && <Link href={href({ page: page + 1 })} className="chip">بعدی</Link>}
          </div>
        )}
      </Card>
    </>
  );
}
