export type PermissionSection = "club" | "unit" | "configuration" | "management";

export type PermissionModule =
  // club
  | "member"
  | "calendar"
  | "newsletter"
  | "protocol"
  | "query"
  | "listprint"
  // unit
  | "equipment"
  | "equipment_type"
  | "vehicle"
  | "vehicle_type"
  | "wearable"
  | "wearable_type"
  | "inspection"
  | "inspection_plan"
  | "respiratory_gear"
  | "respiratory_wearer"
  | "respiratory_mission"
  | "damage_report"
  | "maintenance"
  // configuration
  | "qualification"
  | "award"
  | "executive_position"
  | "communication_type"
  | "membership_status"
  | "newsletter_config"
  | "salutation"
  | "education"
  | "calendar_type"
  | "query_store"
  | "template"
  | "template_usage"
  | "backup"
  // management
  | "user"
  | "role"
  | "webapi"
  | "setting";

export type PermissionType = "read" | "create" | "update" | "delete";

export type PermissionString =
  | `${PermissionSection}.${PermissionModule}.${PermissionType}` // für spezifische Berechtigungen
  | `${PermissionSection}.${PermissionModule}.*` // für alle Berechtigungen in einem Modul
  | `${PermissionSection}.${PermissionType}` // für spezifische Berechtigungen in einem Abschnitt
  | `${PermissionSection}.*` // für alle Berechtigungen in einem Abschnitt
  | `additional.${string}.${string}` // additional
  | "*"; // für Admin

export type PermissionObject = {
  [section in PermissionSection]?: {
    [module in PermissionModule]?: Array<PermissionType> | "*";
  } & { all?: Array<PermissionType> | "*" };
} & {
  admin?: boolean;
  adminByOwner?: boolean;
} & {
  additional?: { [key: string]: string };
};

export type SectionsAndModulesObject = {
  [section in PermissionSection]: Array<PermissionModule>;
} & {
  additional?: Array<{
    key: string;
    name: string;
    type: "number" | "string";
    emptyIfAdmin: boolean;
  }>;
};

export const permissionSections: Array<PermissionSection> = ["club", "unit", "configuration", "management"];
export const permissionModules: Array<PermissionModule> = [
  // club
  "member",
  "calendar",
  "newsletter",
  "protocol",
  "query",
  "listprint",
  // unit
  "equipment",
  "equipment_type",
  "vehicle",
  "vehicle_type",
  "wearable",
  "wearable_type",
  "inspection",
  "inspection_plan",
  "respiratory_gear",
  "respiratory_wearer",
  "respiratory_mission",
  "damage_report",
  "maintenance",
  // configuration
  "qualification",
  "award",
  "executive_position",
  "communication_type",
  "membership_status",
  "newsletter_config",
  "salutation",
  "education",
  "calendar_type",
  "query_store",
  "template",
  "template_usage",
  "backup",
  // management
  "user",
  "role",
  "webapi",
  "setting",
];
export const permissionTypes: Array<PermissionType> = ["read", "create", "update", "delete"];
export const sectionsAndModules: SectionsAndModulesObject = {
  club: ["member", "calendar", "newsletter", "protocol", "query", "listprint"],
  unit: [
    "equipment",
    "equipment_type",
    "vehicle",
    "vehicle_type",
    "wearable",
    "wearable_type",
    "inspection",
    "inspection_plan",
    "respiratory_gear",
    "respiratory_wearer",
    "respiratory_mission",
    "damage_report",
    "maintenance",
  ],
  configuration: [
    "qualification",
    "award",
    "executive_position",
    "communication_type",
    "membership_status",
    "salutation",
    "education",
    "calendar_type",
    "query_store",
    "template",
    "template_usage",
    "newsletter_config",
  ],
  management: ["user", "role", "webapi", "backup", "setting"],
  additional: [
    //{ key: "val", name: "name", type: "number", emptyIfAdmin: true },
  ],
};