// ──────────────────────────────────────────────────────────────────────────
// Vorlagen & Abschnittsarten für Protokolleinträge.
// Bewusst im Code statt in der Datenbank: neue Vorlagen brauchen so keine
// Migration. Der Vorlagenschlüssel wird am Eintrag gespeichert.
// Wird von Server und Client gemeinsam genutzt — hier kein "server-only".
// ──────────────────────────────────────────────────────────────────────────

export type ItemKind =
  | "ADDED"
  | "CHANGED"
  | "FIXED"
  | "REMOVED"
  | "DEPRECATED"
  | "SECURITY"
  | "NOTE"
  | "TODO"
  | "DECISION";

export const ITEM_KINDS: ItemKind[] = [
  "ADDED",
  "CHANGED",
  "FIXED",
  "REMOVED",
  "DEPRECATED",
  "SECURITY",
  "NOTE",
  "TODO",
  "DECISION",
];

export const KIND_META: Record<
  ItemKind,
  { label: string; short: string; color: string; icon: string; placeholder: string }
> = {
  ADDED: {
    label: "Neuerungen",
    short: "Neu",
    color: "#7ee787",
    icon: "plus",
    placeholder: "Was ist neu dazugekommen?",
  },
  CHANGED: {
    label: "Änderungen",
    short: "Geändert",
    color: "#9ed7ff",
    icon: "activity",
    placeholder: "Was wurde geändert oder verbessert?",
  },
  FIXED: {
    label: "Fehlerbehebungen",
    short: "Behoben",
    color: "#38bdf8",
    icon: "check",
    placeholder: "Welcher Fehler wurde behoben?",
  },
  REMOVED: {
    label: "Entfernungen",
    short: "Entfernt",
    color: "#ff7a9c",
    icon: "trash",
    placeholder: "Was wurde entfernt?",
  },
  DEPRECATED: {
    label: "Veraltet",
    short: "Veraltet",
    color: "#ffc36b",
    icon: "alert",
    placeholder: "Was wird künftig wegfallen?",
  },
  SECURITY: {
    label: "Sicherheit",
    short: "Sicherheit",
    color: "#c8bcff",
    icon: "shield",
    placeholder: "Welche Sicherheitsverbesserung gab es?",
  },
  NOTE: {
    label: "Hinweise",
    short: "Hinweis",
    color: "#8aa0c8",
    icon: "list",
    placeholder: "Wichtiger Hinweis für alle …",
  },
  TODO: {
    label: "Offene Punkte",
    short: "Offen",
    color: "#ff9fd7",
    icon: "target",
    placeholder: "Was steht noch aus? (wer, bis wann)",
  },
  DECISION: {
    label: "Beschlüsse",
    short: "Beschluss",
    color: "#a0f0e0",
    icon: "check",
    placeholder: "Was wurde entschieden?",
  },
};

export type TemplateKey = "release" | "hotfix" | "maintenance" | "meeting" | "free";

export type TemplateDef = {
  key: TemplateKey;
  name: string;
  description: string;
  icon: string;
  color: string;
  /** Vorbelegte Abschnitte in Anzeigereihenfolge. */
  sections: ItemKind[];
  /** Versionsfeld anbieten? */
  withVersion: boolean;
  titleHint: string;
};

export const TEMPLATES: TemplateDef[] = [
  {
    key: "release",
    name: "Release",
    description: "Vollständiger Changelog einer Version — Neuerungen bis Sicherheit.",
    icon: "projects",
    color: "#7ee787",
    sections: ["ADDED", "CHANGED", "FIXED", "REMOVED", "DEPRECATED", "SECURITY"],
    withVersion: true,
    titleHint: "z. B. Version 1.4 — Passwortmanager",
  },
  {
    key: "hotfix",
    name: "Hotfix",
    description: "Schnelle Korrektur außer der Reihe.",
    icon: "alert",
    color: "#ff7a9c",
    sections: ["FIXED", "SECURITY", "NOTE"],
    withVersion: true,
    titleHint: "z. B. Hotfix 1.4.1 — Login-Fehler",
  },
  {
    key: "maintenance",
    name: "Wartung",
    description: "Wartungsfenster, Systemarbeiten und Umstellungen.",
    icon: "settings",
    color: "#ffc36b",
    sections: ["CHANGED", "NOTE", "TODO"],
    withVersion: false,
    titleHint: "z. B. Serverwartung Juni",
  },
  {
    key: "meeting",
    name: "Besprechung",
    description: "Themen, Beschlüsse und offene Aufgaben eines Termins.",
    icon: "meetings",
    color: "#a0f0e0",
    sections: ["NOTE", "DECISION", "TODO"],
    withVersion: false,
    titleHint: "z. B. Teamrunde KW 24",
  },
  {
    key: "free",
    name: "Frei",
    description: "Nur Text — Abschnitte nach Bedarf selbst hinzufügen.",
    icon: "edit",
    color: "#9ed7ff",
    sections: [],
    withVersion: false,
    titleHint: "Titel des Eintrags",
  },
];

export function templateFor(key: string): TemplateDef {
  return TEMPLATES.find((t) => t.key === key) ?? TEMPLATES[0];
}

export function isItemKind(v: string): v is ItemKind {
  return (ITEM_KINDS as string[]).includes(v);
}

/** Anzeigereihenfolge der Abschnitte eines Eintrags (Vorlage zuerst). */
export function orderSections(template: string, present: ItemKind[]): ItemKind[] {
  const base = templateFor(template).sections;
  const extra = ITEM_KINDS.filter((k) => !base.includes(k));
  return [...base, ...extra].filter((k) => present.includes(k));
}
