import { ModuleType, PermissionAction, PermissionEffect, PermissionScope } from "omsorgcore-client-ts";

// Die gültige Werte-Menge kommt jetzt aus dem generierten omsorgCore-Client (ModuleType/
// PermissionAction/PermissionEffect sind echte Enums im Backend-Schema, siehe omsorgCore/CLAUDE.md,
// Abschnitt "Rechtesystem") - nur die deutschen Anzeige-Labels bleiben hier im Frontend gepflegt.
// Ein neuer Enum-Wert im Backend taucht nach Regenerieren des Clients automatisch in den Optionen
// auf (Fallback-Label = technischer Wert), statt unbemerkt zu fehlen.
const MODULE_LABELS = {
  [ModuleType.Employees]: "Mitarbeiter",
  [ModuleType.Facilities]: "Einrichtungen",
  [ModuleType.Contracts]: "Verträge",
  [ModuleType.Orders]: "Aufträge",
  [ModuleType.TimeEntries]: "Zeiterfassung",
  [ModuleType.Invoices]: "Rechnungen",
  [ModuleType.Recruiting]: "Recruiting",
  [ModuleType.Controlling]: "Controlling",
  [ModuleType.UserManagement]: "Rollen & Rechte",
  [ModuleType.AuditLog]: "Audit-Log",
  [ModuleType.Documents]: "Dokumente",
  [ModuleType.Users]: "Benutzerkonten",
  [ModuleType.Configuration]: "Konfiguration",
  [ModuleType.Absences]: "Abwesenheiten",
};

const ACTION_LABELS = {
  [PermissionAction.View]: "Ansehen",
  [PermissionAction.Create]: "Anlegen",
  [PermissionAction.Edit]: "Bearbeiten",
  [PermissionAction.Delete]: "Löschen",
  [PermissionAction.Export]: "Export",
  [PermissionAction.Approve]: "Freigeben",
  [PermissionAction.Recover]: "Wiederherstellen",
};

const EFFECT_LABELS = {
  [PermissionEffect.Grant]: "Gewähren",
  [PermissionEffect.Revoke]: "Entziehen",
};

const SCOPE_LABELS = {
  [PermissionScope.All]: "Alle",
  [PermissionScope.Own]: "Nur eigene",
};

function toOptions(enumObject, labels) {
  return Object.values(enumObject).map((value) => ({ value, label: labels[value] ?? value }));
}

export const MODULE_OPTIONS = toOptions(ModuleType, MODULE_LABELS);
export const ACTION_OPTIONS = toOptions(PermissionAction, ACTION_LABELS);
export const EFFECT_OPTIONS = toOptions(PermissionEffect, EFFECT_LABELS);
export const SCOPE_OPTIONS = toOptions(PermissionScope, SCOPE_LABELS);

// Nur diese Module haben serverseitig einen Ownership-Anker (User.EmployeeId / Contract.EmployeeId,
// siehe omsorgCore/CLAUDE.md "Datenebenen-Scope") - für alle anderen Module bleibt Scope faktisch
// wirkungslos, die Matrix/Overrides-UI bietet die Auswahl deshalb nur hier an.
export const SCOPE_CAPABLE_MODULES = [ModuleType.Employees, ModuleType.Contracts, ModuleType.Absences, ModuleType.TimeEntries];
