import { redirect } from "next/navigation";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { Convention } from "@/models/Convention";
import { Client } from "@/models/Client";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { AdminEmptyState } from "@/components/admin/AdminEmptyState";
import { NewConventionForm } from "@/components/admin/NewConventionForm";
import { ConventionRow } from "@/components/admin/ConventionRow";
import { StatsTabs } from "@/components/admin/StatsTabs";
import { AdminWaitlistList } from "@/components/admin/AdminWaitlistList";
import { getConventionWaitlistList } from "@/lib/conventionList";

export const dynamic = "force-dynamic";

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

  const permissions = await getAllPermissions();
  const viewerId = (await getSessionClientId()) || "";
  await connectDB();
  const items = await Convention.find({}).sort({ startDate: 1 }).lean();

  const { entries: waitlistEntries, bookingsByDay } = await getConventionWaitlistList();
  const openCount = waitlistEntries.filter((e) => !e.orderId).length;
  const countByConvention = new Map<string, number>();
  for (const e of waitlistEntries) {
    if (e.orderId) continue;
    countByConvention.set(e.conventionId, (countByConvention.get(e.conventionId) ?? 0) + 1);
  }

  const staff = await Client.find({ role: "staff" }).select("name").sort({ name: 1 }).lean();
  const staffOptions = staff.map((s) => ({ id: String(s._id), name: s.name }));
  const staffById = new Map(staffOptions.map((s) => [s.id, s]));

  const conventionsTab = (
    <>
      <NewConventionForm />
      <div className="flex flex-col gap-3">
        {items.map((item) => (
          <ConventionRow
            key={String(item._id)}
            item={{
              id: String(item._id),
              name: item.name,
              location: item.location,
              startDate: new Date(item.startDate).toISOString(),
              endDate: new Date(item.endDate).toISOString(),
              infoUrl: item.infoUrl,
              slotsAvailable: item.slotsAvailable,
              notes: item.notes,
              notesEn: item.notesEn,
              image: item.image || "",
              logo: item.logo || "",
              visible: item.visible,
              waitlistCount: countByConvention.get(String(item._id)) || 0,
              assignedStaff: (item.assignedStaffIds || [])
                .map((id) => staffById.get(String(id)))
                .filter((s): s is { id: string; name: string } => Boolean(s)),
            }}
            viewerId={viewerId}
            canEditOthers={permissions.conventions_edit}
            staffOptions={staffOptions}
          />
        ))}
        {items.length === 0 && <AdminEmptyState message="Noch keine Conventions angelegt." />}
      </div>
    </>
  );

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <AdminPageHeader
        title="Conventions"
        subtitle="Tab „Conventions“: Einträge für die öffentliche Übersicht pflegen. Tab „Warteliste“: Slot-Anfragen aller Conventions an einem Ort genehmigen."
      />

      <StatsTabs
        tabs={[
          { id: "conventions", label: "Conventions", content: conventionsTab },
          {
            id: "waitlist",
            label: openCount > 0 ? `Warteliste (${openCount})` : "Warteliste",
            content: <AdminWaitlistList entries={waitlistEntries} bookingsByDay={bookingsByDay} />,
          },
        ]}
      />
    </main>
  );
}
