import { redirect } from "next/navigation";
import Link from "next/link";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { connectDB } from "@/lib/db";
import { QmSubmission, type QmTarget } from "@/models/QmSubmission";
import { Client } from "@/models/Client";
import { DocumentTemplate } from "@/models/DocumentTemplate";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { AdminEmptyState } from "@/components/admin/AdminEmptyState";
import { QmReviewCard } from "@/components/admin/QmReviewCard";

export const dynamic = "force-dynamic";

const TARGET_TITLES: Record<QmTarget, string> = { qm: "Qualitätsmanagement", hr: "Personalabteilung" };

export default async function AdminQmPage() {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Forders");
  const permissions = await getAllPermissions();
  if (!permissions.qm && !permissions.hr) redirect("/de/account");

  await connectDB();
  const [submissions, qmTemplates] = await Promise.all([
    QmSubmission.find({}).sort({ createdAt: -1 }).lean(),
    DocumentTemplate.find({ category: "qm" }).sort({ sortOrder: 1 }).lean(),
  ]);
  const submitters = await Client.find({ _id: { $in: submissions.map((s) => String(s.submittedBy)) } }).lean();
  const submitterById = new Map(submitters.map((c) => [String(c._id), c]));

  function renderSection(target: QmTarget) {
    const targetSubmissions = submissions.filter((s) => s.target === target);
    const pending = targetSubmissions.filter((s) => s.status === "pending");
    const decided = targetSubmissions.filter((s) => s.status !== "pending");

    return (
      <section className="mb-12">
        <h2 className="text-sm font-medium text-[var(--rk-ink)] mb-1">{TARGET_TITLES[target]}</h2>
        <p className="text-xs text-[var(--rk-ink-muted)] mb-4">Offen ({pending.length})</p>
        <div className="flex flex-col gap-3 mb-6">
          {pending.map((s) => (
            <QmReviewCard
              key={String(s._id)}
              submission={{
                id: String(s._id),
                title: s.title,
                description: s.description,
                submitterName: s.anonymous ? "Anonym" : submitterById.get(String(s.submittedBy))?.name ?? "?",
                status: s.status,
                reviewNote: s.reviewNote,
                createdAt: new Date(s.createdAt).toISOString(),
                attachmentUrl: s.attachmentStoredName ? `/api/qm/${s._id}/${s.attachmentStoredName}` : null,
              }}
            />
          ))}
          {pending.length === 0 && <AdminEmptyState message="Keine offenen Einreichungen." />}
        </div>

        {decided.length > 0 && (
          <details>
            <summary className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)] cursor-pointer mb-3">
              Bereits geprüft ({decided.length})
            </summary>
            <div className="flex flex-col gap-3 mt-3">
              {decided.map((s) => (
                <QmReviewCard
                  key={String(s._id)}
                  submission={{
                    id: String(s._id),
                    title: s.title,
                    description: s.description,
                    submitterName: s.anonymous ? "Anonym" : submitterById.get(String(s.submittedBy))?.name ?? "?",
                    status: s.status,
                    reviewNote: s.reviewNote,
                    createdAt: new Date(s.createdAt).toISOString(),
                    attachmentUrl: s.attachmentStoredName ? `/api/qm/${s._id}/${s.attachmentStoredName}` : null,
                  }}
                />
              ))}
            </div>
          </details>
        )}
      </section>
    );
  }

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <AdminPageHeader
        title="QM & Personalabteilung"
        subtitle="Von Mitarbeitern eingereichte Vorgänge prüfen, freigeben oder ablehnen. Personal-Anliegen sind nur für die Personalabteilung sichtbar."
      />

      {permissions.qm && qmTemplates.length > 0 && (
        <div className="mb-8 border border-white/10 rounded-xl p-4">
          <p className="text-xs uppercase tracking-[0.08em] text-[var(--rk-ink-muted)] mb-2">
            QM-Vorlagen/Checklisten
          </p>
          <div className="flex flex-wrap gap-2">
            {qmTemplates.map((t) => (
              <span key={String(t._id)} className="text-xs border border-white/15 rounded-full px-3 py-1">
                {t.name}
              </span>
            ))}
          </div>
          <Link href="/de/admin/documents" className="text-xs text-[var(--rk-ink-muted)] underline hover:text-[var(--rk-ink)] mt-2 inline-block">
            Im Dokumenten-Bereich verwalten →
          </Link>
        </div>
      )}

      {permissions.hr && renderSection("hr")}
      {permissions.qm && renderSection("qm")}
    </main>
  );
}
