import { redirect } from "next/navigation";
import Link from "next/link";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { connectDB } from "@/lib/db";
import { Contract } from "@/models/Contract";
import { Order } from "@/models/Order";
import { Client } from "@/models/Client";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { StatCard } from "@/components/admin/StatCard";
import { AdminEmptyState } from "@/components/admin/AdminEmptyState";
import { StatusBadge } from "@/components/admin/AdminContractPanel";
import { ContractReminderButton } from "@/components/admin/ContractReminderButton";
import { formatDateDE } from "@/lib/orderConstants";

export const dynamic = "force-dynamic";

// "sent" (wartet auf Unterschrift) zuerst - das ist die Ansicht, für die
// diese Seite überhaupt gebaut wurde (Nutzer-Wunsch: unterschriebene
// Verträge auf einen Blick finden). Innerhalb einer Gruppe neueste zuerst.
const STATUS_ORDER: Record<string, number> = { sent: 0, draft: 1, declined: 2, signed: 3 };

export default async function AdminContractsPage() {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Fcontracts");
  if (!(await hasPermission("orders_view"))) redirect("/de/account");

  const permissions = await getAllPermissions();

  await connectDB();
  const contracts = await Contract.find({}).sort({ createdAt: -1 }).lean();
  const orderIds = contracts.map((c) => String(c.orderId));
  const clientIds = contracts.map((c) => String(c.clientId));
  const [orders, clients] = await Promise.all([
    Order.find({ _id: { $in: orderIds } }).select("characterOrConcept").lean(),
    Client.find({ _id: { $in: clientIds } }).select("name").lean(),
  ]);
  const orderById = new Map(orders.map((o) => [String(o._id), o]));
  const clientById = new Map(clients.map((c) => [String(c._id), c]));

  const rows = contracts
    .map((c) => ({
      id: String(c._id),
      orderId: String(c.orderId),
      type: c.type,
      status: c.status,
      characterOrConcept: orderById.get(String(c.orderId))?.characterOrConcept || "—",
      clientName: clientById.get(String(c.clientId))?.name || "—",
      sentAt: c.sentAt ? new Date(c.sentAt) : null,
      // .lean() wendet Mongoose-Defaults nicht an - bei Verträgen von vor der
      // reminders[]-Einführung (22.09.2026) fehlt das Feld im rohen Dokument
      // komplett statt [] zu sein (Fund vom Nutzer, 24.09.2026: Seite
      // crashte beim Öffnen).
      lastReminderAt:
        (c.reminders || []).length > 0
          ? new Date(c.reminders[c.reminders.length - 1].sentAt).toISOString()
          : c.sentAt
            ? new Date(c.sentAt).toISOString()
            : null,
    }))
    .sort((a, b) => STATUS_ORDER[a.status] - STATUS_ORDER[b.status]);

  const awaitingCount = rows.filter((r) => r.status === "sent").length;
  const signedCount = rows.filter((r) => r.status === "signed").length;

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <AdminPageHeader title="Verträge" subtitle="Alle Verträge über alle Aufträge hinweg — wartende zuerst." />

      <div className="grid grid-cols-2 sm:grid-cols-3 gap-3 mb-8">
        <StatCard label="Insgesamt" value={rows.length} />
        <StatCard label="Wartet auf Unterschrift" value={awaitingCount} accent={awaitingCount ? "red" : "muted"} />
        <StatCard label="Unterschrieben" value={signedCount} accent="emerald" />
      </div>

      {rows.length === 0 ? (
        <AdminEmptyState message="Noch keine Verträge." />
      ) : (
        <div className="flex flex-col gap-3">
          {rows.map((row) => (
            <div key={row.id} className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-5">
              <div className="flex items-center justify-between flex-wrap gap-3">
                <div className="min-w-0">
                  <Link href={`/de/admin/orders/${row.orderId}`} className="text-sm font-medium text-[var(--rk-ink)] hover:underline">
                    {row.characterOrConcept}
                  </Link>
                  <p className="text-xs text-[var(--rk-ink-muted)] mt-0.5">
                    {row.clientName} · {row.type === "tfp" ? "TFP-Vertrag" : "Vertrag"}
                    {row.sentAt ? ` · Versendet ${formatDateDE(row.sentAt)}` : ""}
                  </p>
                </div>
                <div className="flex items-center gap-3 flex-wrap text-xs shrink-0">
                  <StatusBadge status={row.status} />
                  <a
                    href={`/api/contracts/${row.id}/pdf`}
                    target="_blank"
                    rel="noopener noreferrer"
                    className="border border-white/15 rounded-full px-3 py-1 hover:border-white/50"
                  >
                    PDF ansehen
                  </a>
                  {row.status === "sent" && <ContractReminderButton contractId={row.id} lastReminderAt={row.lastReminderAt} />}
                </div>
              </div>
            </div>
          ))}
        </div>
      )}
    </main>
  );
}
