"use server";

import { revalidatePath } from "next/cache";
import { isAdminSession, hasPermission } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { Absence } from "@/models/Absence";
import { ABSENCE_TYPES, type AbsenceType } from "@/lib/absenceConstants";

type AbsenceFormState = { error?: string };

// Selbstständig eintragbar von jedem Team-Mitglied für die eigene Person —
// kein Genehmigungs-Workflow, reines "wer ist wann weg"-Log, fürs ganze
// Team sichtbar (siehe admin/absences/page.tsx).
export async function createAbsenceAction(_prev: AbsenceFormState, formData: FormData): Promise<AbsenceFormState> {
  if (!(await isAdminSession())) return { error: "Nicht eingeloggt." };
  const clientId = await getSessionClientId();
  if (!clientId) return { error: "Nicht eingeloggt." };

  const typeRaw = String(formData.get("type") || "vacation");
  const type = (ABSENCE_TYPES.includes(typeRaw as AbsenceType) ? typeRaw : "vacation") as AbsenceType;
  const startRaw = String(formData.get("startDate") || "");
  const endRaw = String(formData.get("endDate") || "");
  const start = startRaw ? new Date(startRaw) : null;
  const end = endRaw ? new Date(endRaw) : null;
  const note = String(formData.get("note") || "").trim();

  if (!start || Number.isNaN(start.getTime())) return { error: "Bitte ein gültiges Startdatum angeben." };
  if (!end || Number.isNaN(end.getTime()) || end < start) return { error: "Bitte ein gültiges Enddatum angeben." };

  await connectDB();
  await Absence.create({ clientId, type, startDate: start, endDate: end, note });

  revalidatePath("/de/admin/absences");
  return {};
}

// Löschen darf man die eigenen Einträge immer, fremde nur mit
// team_management_edit (z. B. falls sich jemand vertippt hat und selbst
// nicht mehr rankommt).
export async function deleteAbsenceAction(absenceId: string) {
  if (!(await isAdminSession())) return;
  const clientId = await getSessionClientId();
  await connectDB();
  const absence = await Absence.findById(absenceId);
  if (!absence) return;
  const isOwn = clientId && String(absence.clientId) === clientId;
  if (!isOwn && !(await hasPermission("team_management_edit"))) return;
  await absence.deleteOne();
  revalidatePath("/de/admin/absences");
}
