import "server-only";
import { prisma } from "@/lib/prisma";

// ──────────────────────────────────────────────────────────────────────────
// Systemeinstellungen (in SystemSetting als JSON abgelegt). Aktuell:
// - Mail-Absender (Name + Adresse) für Willkommens-/System-Mails
// - Onboarding-Passwortrichtlinie (generiert oder fester Standardwert)
// ──────────────────────────────────────────────────────────────────────────

const MAIL_KEY = "mail.settings";
const ONBOARDING_KEY = "onboarding.settings";
const ABSENCE_TYPES_KEY = "absence.types";
const NEW_MODULES_KEY = "nav.new_modules";

export type MailSettings = { fromName: string; fromEmail: string };
export type OnboardingSettings = {
  passwordMode: "generated" | "fixed";
  defaultPassword: string;
};
export type AbsenceTypeDef = { key: string; label: string; color: string; countsVacation: boolean };

export const DEFAULT_ABSENCE_TYPES: AbsenceTypeDef[] = [
  { key: "VACATION", label: "Urlaub", color: "#9ed7ff", countsVacation: true },
  { key: "SICK", label: "Krank", color: "#ff7a9c", countsVacation: false },
  { key: "FREE", label: "Freizeitausgleich", color: "#7ee787", countsVacation: false },
  { key: "APPOINTMENT", label: "Termin", color: "#ffc36b", countsVacation: false },
  { key: "EVENT", label: "Event", color: "#c8bcff", countsVacation: false },
  { key: "PRIVATE", label: "Privat", color: "#8aa0c8", countsVacation: false },
];

const MAIL_DEFAULT: MailSettings = {
  fromName: "Avaria Team OS",
  fromEmail: "no-reply@avaria.media",
};
const ONBOARDING_DEFAULT: OnboardingSettings = {
  passwordMode: "generated",
  defaultPassword: "",
};

async function readJson<T>(key: string, fallback: T): Promise<T> {
  const row = await prisma.systemSetting.findUnique({ where: { key } });
  if (!row) return fallback;
  return { ...fallback, ...(row.value as Partial<T>) };
}

async function writeJson(key: string, value: unknown) {
  await prisma.systemSetting.upsert({
    where: { key },
    update: { value: value as object },
    create: { key, value: value as object },
  });
}

export function getMailSettings(): Promise<MailSettings> {
  return readJson(MAIL_KEY, MAIL_DEFAULT);
}
export async function setMailSettings(v: MailSettings): Promise<void> {
  await writeJson(MAIL_KEY, {
    fromName: v.fromName.trim().slice(0, 120) || MAIL_DEFAULT.fromName,
    fromEmail: v.fromEmail.trim().slice(0, 190) || MAIL_DEFAULT.fromEmail,
  });
}

export function getOnboardingSettings(): Promise<OnboardingSettings> {
  return readJson(ONBOARDING_KEY, ONBOARDING_DEFAULT);
}
export async function setOnboardingSettings(v: OnboardingSettings): Promise<void> {
  await writeJson(ONBOARDING_KEY, {
    passwordMode: v.passwordMode === "fixed" ? "fixed" : "generated",
    defaultPassword: v.defaultPassword.slice(0, 120),
  });
}

/** Fertiger From-Header aus den Mail-Einstellungen. */
export async function resolveMailFrom(): Promise<string> {
  const m = await getMailSettings();
  return `${m.fromName} <${m.fromEmail}>`;
}

// ── Abwesenheitsarten (konfigurierbar) ──────────────────────────────────────
export async function getAbsenceTypes(): Promise<AbsenceTypeDef[]> {
  const row = await prisma.systemSetting.findUnique({ where: { key: ABSENCE_TYPES_KEY } });
  if (!row) return DEFAULT_ABSENCE_TYPES;
  const val = row.value as AbsenceTypeDef[];
  return Array.isArray(val) && val.length > 0 ? val : DEFAULT_ABSENCE_TYPES;
}

/** Als „neu" markierte Module (Hrefs) für die Navigations-Hervorhebung. */
export async function getNewModules(): Promise<string[]> {
  const row = await prisma.systemSetting.findUnique({ where: { key: NEW_MODULES_KEY } });
  const val = row?.value as string[] | undefined;
  return Array.isArray(val) ? val : [];
}
export async function setNewModules(hrefs: string[]): Promise<void> {
  await writeJson(NEW_MODULES_KEY, [...new Set(hrefs.filter((h) => typeof h === "string" && h.startsWith("/")))]);
}

export async function setAbsenceTypes(types: AbsenceTypeDef[]): Promise<void> {
  const clean = types
    .map((t) => ({
      key: t.key.trim().toUpperCase().replace(/[^A-Z0-9_]/g, "").slice(0, 40),
      label: t.label.trim().slice(0, 60),
      color: /^#[0-9a-fA-F]{3,8}$/.test(t.color) ? t.color : "#9ed7ff",
      countsVacation: Boolean(t.countsVacation),
    }))
    .filter((t) => t.key && t.label);
  await writeJson(ABSENCE_TYPES_KEY, clean.length ? clean : DEFAULT_ABSENCE_TYPES);
}
