import { redirect, notFound } from "next/navigation";
import Link from "next/link";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { connectDB } from "@/lib/db";
import { Client } from "@/models/Client";
import { Department } from "@/models/Department";
import { Position } from "@/models/Position";
import { Team } from "@/models/Team";
import { GeneratedDocument } from "@/models/GeneratedDocument";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { BirthDateForm } from "@/components/admin/BirthDateForm";
import { SalaryFieldsForm } from "@/components/admin/SalaryFieldsForm";
import { EmploymentRecordsPanel } from "@/components/admin/EmploymentRecordsPanel";
import { OnboardingChecklistPanel } from "@/components/admin/OnboardingChecklistPanel";
import { SensitiveDataPanel } from "@/components/SensitiveDataPanel";
import { DOCUMENT_CATEGORY_LABELS, type DocumentCategory } from "@/lib/documentConstants";
import { PERMISSION_LABELS } from "@/lib/permissions";
import { probationEndDate, PROBATION_ELIGIBLE_TYPES } from "@/lib/employment";
import { formatDateDE } from "@/lib/orderConstants";
import { getSensitiveDataAuditLogAction } from "@/lib/actions/sensitiveData";

export const dynamic = "force-dynamic";

export default async function StaffFilePage({ params }: { params: Promise<{ clientId: string }> }) {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Fteam");
  if (!(await hasPermission("team_management_view"))) redirect("/de/account");
  const permissions = await getAllPermissions();
  const canViewSensitiveData = permissions.payroll_sensitive_data;
  const { clientId } = await params;

  await connectDB();
  const client = await Client.findById(clientId).lean();
  if (!client || client.role !== "staff") notFound();

  const [department, position, teams, documents, sensitiveDataAuditLog] = await Promise.all([
    client.departmentId ? Department.findById(client.departmentId).lean() : null,
    client.positionId ? Position.findById(client.positionId).lean() : null,
    Team.find({ _id: { $in: (client.teamIds || []).map(String) } }).lean(),
    GeneratedDocument.find({ clientId }).sort({ createdAt: -1 }).lean(),
    canViewSensitiveData ? getSensitiveDataAuditLogAction(clientId) : Promise.resolve([]),
  ]);

  const permissionSummary =
    !position || position.permissions === null || position.permissions === undefined
      ? "Vollzugriff"
      : position.permissions.length > 0
        ? position.permissions.map((p) => PERMISSION_LABELS[p]).join(", ")
        : "Keine Berechtigungen";

  // Aktuell laufende Probezeit oben in der Übersicht anzeigen — bewusst der
  // zuletzt begonnene Eintrag mit Probezeit-Bezug (employee ODER apprentice,
  // Azubis haben laut § 20 BBiG ebenfalls eine Probezeit; nicht einfach der
  // zuletzt begonnene Eintrag insgesamt), damit eine später hinzugefügte
  // Notiz oder Kündigung die Anzeige nicht verdeckt. Nur relevant, solange
  // das Verhältnis nicht schon beendet ist und das Probezeit-Ende noch nicht
  // erreicht ist.
  const latestEmployeeRecord = [...(client.employmentRecords || [])]
    .filter((r) => PROBATION_ELIGIBLE_TYPES.includes(r.type as (typeof PROBATION_ELIGIBLE_TYPES)[number]))
    .sort((a, b) => new Date(b.startDate).getTime() - new Date(a.startDate).getTime())[0];
  let activeProbation: { endDate: Date; daysLeft: number } | null = null;
  if (latestEmployeeRecord?.probationMonths && (!latestEmployeeRecord.endDate || new Date(latestEmployeeRecord.endDate) >= new Date())) {
    const endDate = probationEndDate(new Date(latestEmployeeRecord.startDate), latestEmployeeRecord.probationMonths);
    const daysLeft = Math.ceil((endDate.getTime() - Date.now()) / (24 * 60 * 60 * 1000));
    if (daysLeft >= 0) activeProbation = { endDate, daysLeft };
  }

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <Link href="/de/admin/team" className="text-xs text-[var(--rk-ink-muted)] hover:text-[var(--rk-ink)] transition-colors">
        ← Team & Rechte
      </Link>

      <div className="mt-4 flex items-center gap-4 mb-8">
        {client.avatarPath ? (
          // eslint-disable-next-line @next/next/no-img-element
          <img
            src={`/api/avatars/${client._id}/${client.avatarPath}`}
            alt=""
            className="w-16 h-16 rounded-full object-cover border border-white/15 shrink-0"
          />
        ) : (
          <div className="w-16 h-16 rounded-full border border-white/15 bg-white/5 flex items-center justify-center text-xl text-[var(--rk-ink-muted)] shrink-0">
            {client.firstName?.[0]?.toUpperCase() ?? client.name?.[0]?.toUpperCase() ?? "?"}
          </div>
        )}
        <div>
          <h1 className="text-xl font-medium text-[var(--rk-ink)]">{client.name}</h1>
          <p className="text-sm text-[var(--rk-ink-muted)] mt-0.5">{client.email}</p>
        </div>
      </div>

      <div className="bg-[var(--rk-surface)] border border-white/10 rounded-2xl p-5 mb-8 grid grid-cols-1 sm:grid-cols-2 gap-4">
        <div>
          <p className="text-xs uppercase tracking-[0.08em] text-[var(--rk-ink-muted)] mb-1">Abteilung / Position</p>
          <p className="text-sm">{[position?.name, department?.name].filter(Boolean).join(" · ") || "—"}</p>
        </div>
        <div>
          <p className="text-xs uppercase tracking-[0.08em] text-[var(--rk-ink-muted)] mb-1">Teams</p>
          <p className="text-sm">{teams.map((t) => t.name).join(", ") || "—"}</p>
        </div>
        <div className="sm:col-span-2">
          <p className="text-xs uppercase tracking-[0.08em] text-[var(--rk-ink-muted)] mb-1">Berechtigungen (über Position)</p>
          <p className="text-sm">
            {permissionSummary}
            {!position && <span className="text-[var(--rk-ink-muted)]"> — keine Position zugewiesen</span>}
          </p>
        </div>
        {activeProbation && (
          <div className="sm:col-span-2">
            <p className="text-xs uppercase tracking-[0.08em] text-amber-400 mb-1">Probezeit läuft</p>
            <p className="text-sm text-amber-400">
              Bis {formatDateDE(activeProbation.endDate)} — noch{" "}
              {activeProbation.daysLeft === 0 ? "heute letzter Tag" : `${activeProbation.daysLeft} Tag${activeProbation.daysLeft === 1 ? "" : "e"}`}
            </p>
          </div>
        )}
        <BirthDateForm
          clientId={String(client._id)}
          value={client.birthDate ? new Date(client.birthDate).toISOString().slice(0, 10) : ""}
        />
        <SalaryFieldsForm
          clientId={String(client._id)}
          hourlyWage={client.hourlyWage ?? null}
          monthlyHours={client.monthlyHours ?? null}
          suggestedHourlyWage={position?.defaultHourlyWage ?? department?.defaultHourlyWage ?? null}
        />
      </div>

      {canViewSensitiveData && (
        <div className="mb-8">
          <SensitiveDataPanel clientId={String(client._id)} auditLog={sensitiveDataAuditLog} />
        </div>
      )}

      <div className="mb-8">
        <EmploymentRecordsPanel
          clientId={String(client._id)}
          records={(client.employmentRecords || []).map((r) => ({
            id: String(r._id),
            type: r.type,
            startDate: new Date(r.startDate).toISOString(),
            endDate: r.endDate ? new Date(r.endDate).toISOString() : null,
            probationMonths: r.probationMonths ?? null,
            terminationType: r.terminationType ?? null,
            note: r.note || "",
          }))}
        />
      </div>

      <div className="mb-8">
        <OnboardingChecklistPanel
          clientId={String(client._id)}
          items={(client.onboardingChecklist || []).map((i) => ({ id: String(i._id), text: i.text, done: i.done }))}
          canEdit={permissions.team_management_edit}
        />
      </div>

      <h2 className="text-sm font-medium text-[var(--rk-ink)] mb-3">Dokumente ({documents.length})</h2>
      <div className="flex flex-col gap-2">
        {documents.map((d) => (
          <div key={String(d._id)} className="flex items-center justify-between gap-3 bg-[var(--rk-surface)] border border-white/10 rounded-xl px-4 py-3">
            <div className="min-w-0">
              <p className="text-sm truncate">
                {d.templateName}{" "}
                <span className="text-xs text-[var(--rk-ink-muted)]">· {DOCUMENT_CATEGORY_LABELS[d.category as DocumentCategory]}</span>
              </p>
              <p className="text-xs text-[var(--rk-ink-muted)]">{formatDateDE(new Date(d.createdAt))}</p>
            </div>
            <a
              href={`/api/documents/${d._id}/pdf`}
              target="_blank"
              rel="noopener noreferrer"
              className="text-xs border border-white/30 rounded-lg px-3 py-1.5 hover:border-white transition-colors shrink-0"
            >
              PDF öffnen
            </a>
          </div>
        ))}
        {documents.length === 0 && (
          <p className="text-sm text-[var(--rk-ink-muted)]">
            Noch keine Dokumente für {client.firstName || client.name}. Unter{" "}
            <Link href="/de/admin/documents" className="underline hover:text-[var(--rk-ink)]">
              Dokumente
            </Link>{" "}
            welche erstellen.
          </p>
        )}
      </div>
    </main>
  );
}
