// Getrennt von models/Client.ts, damit Client-Komponenten diese Konstanten
// importieren können, ohne Mongoose in den Browser-Bundle zu ziehen.

// Bereiche mit einer einzigen, nicht weiter sinnvoll aufteilbaren Fähigkeit
// (kein eigenständiges "Erstellen/Bearbeiten/Löschen" in der UI).
const SINGLE_ACTION_AREAS = [
  "pricing",
  "payments",
  "invoicing",
  "statistics",
  "settings",
  "seo",
  "qm",
  "hr",
  "client_accounts",
  // Eigene, enge Berechtigung statt Teil von "hr" (Personalsystem,
  // 24.09.2026) - IBAN/Sozialversicherungsnummer/Steuer-ID sind
  // hochsensible personenbezogene Daten, "hr" gilt schon breit für
  // Dokumente/QM allgemein. Gleiches Muster wie client_accounts.
  "payroll_sensitive_data",
  "guide",
  "contract_templates",
  "logs",
  // Eigene, enge Berechtigung statt Teil von "payments" (Guthaben-System,
  // 28.09.2026) — echtes Kontoguthaben manuell buchen ist eine
  // geldwerte Aktion, soll nur der Finanzabteilung offenstehen, nicht
  // jedem mit Zahlungsstatus-Rechten. Jede Buchung wird protokolliert
  // (CreditTransaction-Ledger), gleiches Muster wie payroll_sensitive_data.
  "credit_booking",
  // Mail-App (eigenes Projekt, Mailcow-Anbindung). mail_access: eigenes
  // Postfach nutzen; mail_admin: Postfächer anlegen/verknüpfen und "Senden
  // als" vergeben — getrennt, damit nicht jede Mitarbeiterin Postfächer
  // verwalten kann. Die eigentliche Prüfung macht der Mail-Dienst selbst.
  "mail_access",
  "mail_admin",
] as const;

// Bereiche mit eigenständigem Anlegen/Bearbeiten/Ansehen, aber ohne
// Lösch-Funktion in der UI (kein Order-Hard-Delete, Gutscheine werden
// storniert statt gelöscht).
const VIEW_EDIT_AREAS = ["clients"] as const;
const VIEW_CREATE_EDIT_AREAS = ["vouchers", "orders"] as const;
const VIEW_CREATE_DELETE_AREAS = ["expenses"] as const;

// Bereiche mit vollem Anlegen/Bearbeiten/Löschen — die meisten eigenständigen
// Verwaltungsbereiche im Admin.
const FULL_CRUD_AREAS = [
  "portfolio",
  "blog",
  "testimonials",
  "faq",
  "conventions",
  "discounts",
  "calendars",
  "documents",
  "team_management",
  "rejection_reasons",
  "services",
  "bundles",
  "todos",
  "price_templates",
] as const;

// Bereiche ohne eigenes "Ansehen"-Recht — Ansehen ist für jede:s
// Team-Mitglied immer möglich (kein Rechte-Check auf der Seite selbst),
// nur Anlegen/Bearbeiten/Löschen ist eingeschränkt. Bisher nur das Intranet:
// interne Abläufe/SOPs sollen wirklich alle nachlesen können (auch neue
// Azubis am ersten Tag), ohne dass dafür extra ein Recht vergeben werden muss.
const CREATE_EDIT_DELETE_AREAS = ["intranet"] as const;

type SingleActionArea = (typeof SINGLE_ACTION_AREAS)[number];
type ViewEditArea = (typeof VIEW_EDIT_AREAS)[number];
type ViewCreateEditArea = (typeof VIEW_CREATE_EDIT_AREAS)[number];
type ViewCreateDeleteArea = (typeof VIEW_CREATE_DELETE_AREAS)[number];
type FullCrudArea = (typeof FULL_CRUD_AREAS)[number];
type CreateEditDeleteArea = (typeof CREATE_EDIT_DELETE_AREAS)[number];

const viewEdit = VIEW_EDIT_AREAS.flatMap((a) => [`${a}_view`, `${a}_edit`] as const);
const viewCreateEdit = VIEW_CREATE_EDIT_AREAS.flatMap((a) => [`${a}_view`, `${a}_create`, `${a}_edit`] as const);
const viewCreateDelete = VIEW_CREATE_DELETE_AREAS.flatMap((a) => [`${a}_view`, `${a}_create`, `${a}_delete`] as const);
const fullCrud = FULL_CRUD_AREAS.flatMap((a) => [`${a}_view`, `${a}_create`, `${a}_edit`, `${a}_delete`] as const);
const createEditDelete = CREATE_EDIT_DELETE_AREAS.flatMap((a) => [`${a}_create`, `${a}_edit`, `${a}_delete`] as const);

export const PERMISSIONS = [
  ...SINGLE_ACTION_AREAS,
  ...viewEdit,
  ...viewCreateEdit,
  ...viewCreateDelete,
  ...fullCrud,
  ...createEditDelete,
] as const;
export type Permission = (typeof PERMISSIONS)[number];

const AREA_LABELS: Record<
  SingleActionArea | ViewEditArea | ViewCreateEditArea | ViewCreateDeleteArea | FullCrudArea | CreateEditDeleteArea,
  string
> = {
  pricing: "Preisverhandlung",
  payments: "Zahlungsstatus setzen",
  invoicing: "Rechnungen & Mahnungen",
  statistics: "Statistiken",
  settings: "Systemeinstellungen",
  seo: "SEO",
  qm: "Qualitätsmanagement",
  hr: "Personalabteilung",
  client_accounts: "Kundenkonten (Passwort/Firma)",
  payroll_sensitive_data: "Sensible Personaldaten (Bankverbindung/SV-Nr./Steuer-ID)",
  guide: "Handbuch",
  contract_templates: "Vertragsvorlagen",
  logs: "Systemprotokoll",
  credit_booking: "Kundenguthaben",
  mail_access: "Mail-App: eigenes Postfach",
  mail_admin: "Mail-App: Postfächer verwalten",
  orders: "Aufträge",
  clients: "Kundenakten",
  vouchers: "Geschenkgutscheine",
  expenses: "Ausgaben",
  portfolio: "Portfolio",
  blog: "Blog",
  testimonials: "Kundenstimmen",
  faq: "FAQ",
  conventions: "Conventions",
  discounts: "Rabattcodes",
  calendars: "Kalender",
  documents: "Dokumente & Vorlagen",
  team_management: "Team & Rechte",
  rejection_reasons: "Ablehnungsgründe",
  services: "Angebote (Preisstufen)",
  bundles: "Pakete",
  todos: "ToDos (Team-weite Sicht)",
  price_templates: "Preisvorschlags-Vorlagen",
  intranet: "Intranet (interne Abläufe)",
};

const ACTION_LABELS: Record<"view" | "create" | "edit" | "delete", string> = {
  view: "Ansehen",
  create: "Erstellen",
  edit: "Bearbeiten",
  delete: "Löschen",
};

// Für die Rechte-Matrix im Admin: welche Bereiche wie aufgeteilt sind, damit
// die UI die passenden Spalten (Ansehen/Erstellen/Bearbeiten/Löschen) pro
// Zeile rendern kann, statt für jeden Bereich einzeln Sonderfälle zu pflegen.
export const PERMISSION_AREA_GROUPS: {
  area: string;
  label: string;
  actions: ("view" | "create" | "edit" | "delete")[];
}[] = [
  ...SINGLE_ACTION_AREAS.map((area) => ({ area, label: AREA_LABELS[area], actions: ["view"] as ("view" | "create" | "edit" | "delete")[] })),
  ...VIEW_EDIT_AREAS.map((area) => ({ area, label: AREA_LABELS[area], actions: ["view", "edit"] as ("view" | "create" | "edit" | "delete")[] })),
  ...VIEW_CREATE_EDIT_AREAS.map((area) => ({
    area,
    label: AREA_LABELS[area],
    actions: ["view", "create", "edit"] as ("view" | "create" | "edit" | "delete")[],
  })),
  ...VIEW_CREATE_DELETE_AREAS.map((area) => ({
    area,
    label: AREA_LABELS[area],
    actions: ["view", "create", "delete"] as ("view" | "create" | "edit" | "delete")[],
  })),
  ...FULL_CRUD_AREAS.map((area) => ({
    area,
    label: AREA_LABELS[area],
    actions: ["view", "create", "edit", "delete"] as ("view" | "create" | "edit" | "delete")[],
  })),
  ...CREATE_EDIT_DELETE_AREAS.map((area) => ({
    area,
    label: AREA_LABELS[area],
    actions: ["create", "edit", "delete"] as ("view" | "create" | "edit" | "delete")[],
  })),
];

const SINGLE_ACTION_SET: readonly string[] = SINGLE_ACTION_AREAS;

export const PERMISSION_LABELS: Record<Permission, string> = Object.fromEntries(
  PERMISSIONS.map((p) => {
    if (SINGLE_ACTION_SET.includes(p)) return [p, AREA_LABELS[p as SingleActionArea]];
    const lastUnderscore = p.lastIndexOf("_");
    const area = p.slice(0, lastUnderscore) as keyof typeof AREA_LABELS;
    const action = p.slice(lastUnderscore + 1) as keyof typeof ACTION_LABELS;
    return [p, `${AREA_LABELS[area]} — ${ACTION_LABELS[action]}`];
  })
) as Record<Permission, string>;

export const PERMISSION_DESCRIPTIONS: Record<Permission, string> = {
  pricing: "Preise vorschlagen, Gegenvorschläge annehmen/ablehnen, Vergütungsart (bezahlt/TFP) festlegen",
  payments: "Aufträge als bezahlt oder unbezahlt markieren",
  invoicing: "Rechnungen erstellen, Zahlungserinnerungen & Mahnungen versenden",
  statistics: "Statistiken und EÜR-Export einsehen",
  settings: "Rechnungs-/Geschäftsdaten, Zahlungsanbieter, Wartungsmodus",
  seo: "Meta-Angaben, Suchmaschinen-Verifizierung, Social-Preview-Bild und Analytics verwalten",
  qm: "Eingereichte QM-Vorgänge prüfen, freigeben oder ablehnen",
  hr: "Vertrauliche Personal-Anliegen von Mitarbeitern einsehen und bearbeiten",
  client_accounts: "Kundenkonten vor Ort anlegen (mit Übergangspasswort, Passwort-Wechsel beim ersten Login erzwungen), Passwörter setzen und das Unternehmensfeld bearbeiten — bewusst getrennt von reiner Kundenakten-Einsicht",
  payroll_sensitive_data: "IBAN, Sozialversicherungsnummer und Steuer-ID von Mitarbeitern einsehen/bearbeiten — bewusst getrennt von der breiteren Personalabteilung-Berechtigung, jeder Zugriff wird protokolliert",
  guide: "Das interne Handbuch einsehen (Beschreibung aller Funktionen der Seite)",
  contract_templates: "Vertragstexte (Standard- und TFP-Vertrag) bearbeiten — Klauseln, AGB-Verweis, Formulierungen",
  logs: "Systemprotokoll einsehen — technische Fehler (Server & Browser) samt Stacktrace sowie das zusammengeführte Aktivitätsprotokoll aller Bereiche",
  credit_booking: "Echtes Kontoguthaben manuell auf Kundenkonten buchen (z. B. Empfehlungsprämien, Storno-Rückerstattungen) — bewusst getrennt von der breiteren Zahlungsstatus-Berechtigung, jede Buchung wird protokolliert",
  mail_access: "Die Mail-App nutzen und das eigene zugewiesene Postfach lesen und senden",
  mail_admin: "Mailcow-Postfächer anlegen und mit Mitarbeiter:innen verknüpfen, „Senden als“ vergeben — bewusst eng, nicht automatisch an alle Positionen",
  orders_view: "Aufträge, Kanban-Status, Verträge, Fotofreigabe einsehen",
  orders_create: "Aufträge im Namen eines Kunden anlegen (z. B. bei spontanen Anfragen vor Ort)",
  orders_edit: "Status, Termin, interne Notizen, Verträge, Fotofreigabe bearbeiten, archivieren",
  clients_view: "Kundenakten, Kontaktdaten, Auftragshistorie einsehen",
  clients_edit: "Tags setzen und Kundenakte bearbeiten",
  vouchers_view: "Geschenkgutscheine einsehen",
  vouchers_create: "Geschenkgutscheine manuell ausstellen (einzeln oder als Bulk)",
  vouchers_edit: "Zahlungseingang bestätigen, stornieren",
  expenses_view: "Ausgaben einsehen",
  expenses_create: "Ausgaben erfassen",
  expenses_delete: "Ausgaben löschen",
  portfolio_view: "Portfolio-Beiträge einsehen",
  portfolio_create: "Portfolio-Beiträge erstellen",
  portfolio_edit: "Portfolio-Beiträge bearbeiten, sortieren, Featured auswählen",
  portfolio_delete: "Portfolio-Beiträge löschen",
  blog_view: "Blog-Beiträge einsehen",
  blog_create: "Blog-Beiträge erstellen",
  blog_edit: "Blog-Beiträge bearbeiten, veröffentlichen",
  blog_delete: "Blog-Beiträge löschen",
  testimonials_view: "Kundenstimmen einsehen",
  testimonials_create: "Kundenstimmen erstellen (auch aus Feedback übernehmen)",
  testimonials_edit: "Kundenstimmen bearbeiten, sortieren",
  testimonials_delete: "Kundenstimmen löschen",
  faq_view: "FAQ-Einträge einsehen",
  faq_create: "FAQ-Einträge erstellen",
  faq_edit: "FAQ-Einträge bearbeiten, sortieren",
  faq_delete: "FAQ-Einträge löschen",
  conventions_view: "Conventions einsehen, Warteliste einsehen",
  conventions_create: "Conventions anlegen",
  conventions_edit: "Conventions bearbeiten, Warteliste benachrichtigen",
  conventions_delete: "Conventions löschen",
  discounts_view: "Rabattcodes einsehen",
  discounts_create: "Rabattcodes erstellen",
  discounts_edit: "Rabattcodes bearbeiten, Einlösungen entfernen",
  discounts_delete: "Rabattcodes löschen",
  calendars_view: "Zusätzliche Kalender einsehen",
  calendars_create: "Zusätzliche Kalender anlegen",
  calendars_edit: "Kalender bearbeiten, teilen, mit Google verbinden",
  calendars_delete: "Kalender löschen",
  documents_view: "Dokumentvorlagen und erstellte Dokumente einsehen",
  documents_create: "Vorlagen und Dokumente erstellen",
  documents_edit: "Vorlagen und Dokumente bearbeiten, digital unterschreiben",
  documents_delete: "Vorlagen und Dokumente löschen",
  team_management_view: "Abteilungen, Positionen, Teams, Mitarbeiter, Personalakten und Aktivitätsprotokoll einsehen",
  team_management_create: "Abteilungen, Positionen, Teams anlegen, Personalakte-Einträge hinzufügen",
  team_management_edit: "Umbenennen, Mitarbeiter zuordnen, Rechte einer Position ändern, Mitarbeiterstatus setzen",
  team_management_delete: "Abteilungen, Positionen, Teams löschen, Personalakte-Einträge löschen",
  rejection_reasons_view: "Ablehnungsgründe einsehen",
  rejection_reasons_create: "Ablehnungsgründe anlegen",
  rejection_reasons_edit: "Ablehnungsgründe aktivieren/deaktivieren",
  rejection_reasons_delete: "Ablehnungsgründe löschen",
  services_view: "Angebote/Preisstufen einsehen",
  services_create: "Angebote und Preisstufen anlegen",
  services_edit: "Angebote und Preisstufen bearbeiten (inkl. Zusatzoptionen, Aktionspreise)",
  services_delete: "Angebote und Preisstufen löschen",
  bundles_view: "Pakete einsehen",
  bundles_create: "Pakete anlegen",
  bundles_edit: "Pakete bearbeiten",
  bundles_delete: "Pakete löschen",
  todos_view: "ToDos aller Mitarbeiter einsehen — die eigenen ToDos sieht jede:r immer, unabhängig von dieser Berechtigung",
  todos_create: "ToDos für andere Mitarbeiter anlegen — sich selbst welche anzulegen kann jede:r immer",
  todos_edit: "Fremde ToDos bearbeiten/Status ändern — eigene kann jede:r immer bearbeiten",
  todos_delete: "Fremde ToDos löschen — eigene kann jede:r immer löschen",
  price_templates_view: "Preisvorschlags-Vorlagen einsehen und im Preisvorschlag eines Auftrags anwenden",
  price_templates_create: "Preisvorschlags-Vorlagen anlegen",
  price_templates_edit: "Preisvorschlags-Vorlagen bearbeiten, sortieren",
  price_templates_delete: "Preisvorschlags-Vorlagen löschen",
  // Kein intranet_view — Ansehen ist für jede:s Team-Mitglied immer möglich,
  // siehe Kommentar bei CREATE_EDIT_DELETE_AREAS oben.
  intranet_create: "Interne Ablauf-Beiträge erstellen",
  intranet_edit: "Interne Ablauf-Beiträge bearbeiten, sortieren",
  intranet_delete: "Interne Ablauf-Beiträge löschen",
};
