import { redirect } from "next/navigation";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { connectDB } from "@/lib/db";
import { Client } from "@/models/Client";
import { VacationRequest } from "@/models/VacationRequest";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { VacationApprovalInbox } from "@/components/admin/VacationApprovalInbox";
import { remainingVacationDays } from "@/lib/vacationBalance";

export const dynamic = "force-dynamic";

// Team-weiter Genehmigungs-Eingang fürs neue Urlaubssystem (Personalsystem-
// Ergänzung, 25.09.2026) - eigenständig neben /admin/absences (bewusst ohne
// Genehmigungs-Workflow, siehe Absence.ts) und neben dem unrelated Kunden-
// Banner unter /admin/calendar?vacation=1 (öffentliche Kalender-Anzeige).
export default async function VacationRequestsPage() {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Furlaubsantraege");
  if (!(await hasPermission("hr"))) redirect("/de/account");
  const permissions = await getAllPermissions();

  await connectDB();
  const pending = await VacationRequest.find({ status: "requested" }).sort({ createdAt: 1 }).lean();
  const clientIds = [...new Set(pending.map((r) => String(r.clientId)))];

  const [staff, activeForThoseClients] = await Promise.all([
    Client.find({ _id: { $in: clientIds } }).select("name vacationDaysPerYear").lean(),
    VacationRequest.find({ clientId: { $in: clientIds }, status: { $in: ["requested", "approved"] } })
      .select("clientId status workDaysCount startDate")
      .lean(),
  ]);
  const staffById = new Map(staff.map((c) => [String(c._id), c]));

  const requests = pending.map((r) => {
    const year = new Date(r.startDate).getFullYear();
    const client = staffById.get(String(r.clientId));
    const sameEmployeeYear = activeForThoseClients.filter(
      (x) => String(x.clientId) === String(r.clientId) && new Date(x.startDate).getFullYear() === year
    );
    const allowance = client?.vacationDaysPerYear ?? null;
    const balance = remainingVacationDays(allowance, sameEmployeeYear);
    return {
      id: String(r._id),
      employeeName: client?.name || "—",
      startDate: new Date(r.startDate).toISOString(),
      endDate: new Date(r.endDate).toISOString(),
      workDaysCount: r.workDaysCount,
      note: r.note || "",
      allowance,
      approvedDays: balance.approvedDays,
      pendingDays: balance.pendingDays,
      wouldExceed: allowance !== null && balance.approvedDays + balance.pendingDays > allowance,
    };
  });

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <AdminPageHeader
        title="Urlaubsanträge"
        subtitle="Offene Anträge genehmigen oder ablehnen. Ein Hinweis (⚠) erscheint, wenn die bereits genehmigten + offenen Tage einer Person das Jahres-Kontingent übersteigen würden — das System verhindert die Genehmigung nicht, HR entscheidet."
      />
      <VacationApprovalInbox requests={requests} />
    </main>
  );
}
