import Link from "next/link";
import { prisma } from "@/lib/prisma";
import { requireCrmAdmin } from "@/lib/crm/admin-access";
import CustomerAdminShell from "../CustomerAdminShell";

export const dynamic = "force-dynamic";

function formatMoney(value: { toString(): string }) {
  return `₹${value.toString()}`;
}

export default async function ReportsPage() {
  await requireCrmAdmin();

  const [
    leadCount,
    customerCount,
    projectCount,
    quotationCount,
    invoiceCount,
    paymentCount,
    taskCount,
    ticketCount,
    leadStatuses,
    projectStatuses,
    invoiceStatuses,
    paymentStatuses,
    taskStatuses,
    ticketStatuses,
    invoiceTotals,
    verifiedPayments,
  ] = await Promise.all([
    prisma.lead.count(),
    prisma.client.count(),
    prisma.project.count(),
    prisma.quotation.count(),
    prisma.invoice.count(),
    prisma.payment.count(),
    prisma.task.count(),
    prisma.supportTicket.count(),

    prisma.lead.groupBy({
      by: ["status"],
      _count: { _all: true },
    }),

    prisma.project.groupBy({
      by: ["status"],
      _count: { _all: true },
    }),

    prisma.invoice.groupBy({
      by: ["status"],
      _count: { _all: true },
    }),

    prisma.payment.groupBy({
      by: ["status"],
      _count: { _all: true },
    }),

    prisma.task.groupBy({
      by: ["status"],
      _count: { _all: true },
    }),

    prisma.supportTicket.groupBy({
      by: ["status"],
      _count: { _all: true },
    }),

    prisma.invoice.aggregate({
      where: {
        status: {
          notIn: ["DRAFT", "CANCELLED"],
        },
      },
      _sum: {
        totalAmount: true,
        amountPaid: true,
      },
    }),

    prisma.payment.aggregate({
      where: { status: "VERIFIED" },
      _sum: { amount: true },
    }),
  ]);

  const cards = [
    ["Leads", leadCount, "/admin/leads"],
    ["Customers", customerCount, "/admin/customers"],
    ["Projects", projectCount, "/admin/projects"],
    ["Quotations", quotationCount, "/admin/quotations"],
    ["Invoices", invoiceCount, "/admin/invoices"],
    ["Payments", paymentCount, "/admin/payments"],
    ["Tasks", taskCount, "/admin/tasks"],
    ["Support Tickets", ticketCount, "/admin/support-tickets"],
  ] as const;

  const sections = [
    ["Lead Status", leadStatuses],
    ["Project Status", projectStatuses],
    ["Invoice Status", invoiceStatuses],
    ["Payment Status", paymentStatuses],
    ["Task Status", taskStatuses],
    ["Support Ticket Status", ticketStatuses],
  ] as const;

  return (
    <CustomerAdminShell>
      <main className="mx-auto max-w-7xl space-y-8 px-5 py-8">
        <div>
          <Link href="/admin" className="text-sm text-blue-600">
            ← Dashboard
          </Link>
          <h1 className="mt-3 text-3xl font-bold">CRM Reports</h1>
          <p className="mt-2 text-sm text-slate-500">
            Current CRM record counts and financial summaries.
          </p>
        </div>

        <section className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
          {cards.map(([label, count, href]) => (
            <Link
              key={label}
              href={href}
              className="rounded-2xl border bg-white p-5 hover:bg-slate-50"
            >
              <p className="text-sm text-slate-500">{label}</p>
              <p className="mt-2 text-3xl font-bold">{count}</p>
            </Link>
          ))}
        </section>

        <section className="grid gap-4 md:grid-cols-3">
          <div className="rounded-2xl border bg-white p-5">
            <p className="text-sm text-slate-500">
              Issued / Active Invoice Total
            </p>
            <p className="mt-2 text-2xl font-bold">
              {formatMoney(
                invoiceTotals._sum.totalAmount ?? { toString: () => "0" }
              )}
            </p>
          </div>

          <div className="rounded-2xl border bg-white p-5">
            <p className="text-sm text-slate-500">
              Invoice Amount Paid
            </p>
            <p className="mt-2 text-2xl font-bold">
              {formatMoney(
                invoiceTotals._sum.amountPaid ?? { toString: () => "0" }
              )}
            </p>
          </div>

          <div className="rounded-2xl border bg-white p-5">
            <p className="text-sm text-slate-500">
              Verified Payments
            </p>
            <p className="mt-2 text-2xl font-bold">
              {formatMoney(
                verifiedPayments._sum.amount ?? { toString: () => "0" }
              )}
            </p>
          </div>
        </section>

        <section className="grid gap-4 md:grid-cols-2">
          {sections.map(([title, rows]) => (
            <article
              key={title}
              className="rounded-2xl border bg-white p-5"
            >
              <h2 className="mb-4 text-lg font-bold">{title}</h2>

              {rows.length === 0 ? (
                <p className="text-sm text-slate-500">
                  No records yet.
                </p>
              ) : (
                <div className="space-y-2">
                  {rows.map((row) => (
                    <div
                      key={row.status}
                      className="flex justify-between gap-4 border-b py-2 text-sm"
                    >
                      <span>{row.status.replaceAll("_", " ")}</span>
                      <strong>{row._count._all}</strong>
                    </div>
                  ))}
                </div>
              )}
            </article>
          ))}
        </section>
      </main>
    </CustomerAdminShell>
  );
}
