// src/lib/auth/sys-permissions-const.ts — constantes PURES du plan SYSTÈME,
// extraites de sys-permissions.ts (qui a `server-only`) pour rester
// importables côté client (grille de permissions /admin/staff). AUCUNE
// logique de session/DB ici — seulement des données statiques.
// sys-permissions.ts les ré-exporte : aucun changement d'API pour les
// consommateurs serveur existants.

/** Permissions assignables à un Staff SYS, groupées par ressource — source de
 *  vérité de la grille UI (/admin/staff) ET du gate. */
export const SYS_PERMISSION_GROUPS = {
  users: [
    "users:read",
    "users:ban",
    "users:role",
    "users:2fa-reset",
    "users:email",
    "users:sessions",
  ],
  orgs: ["orgs:read", "orgs:members", "orgs:limits"],
  billing: ["billing:read", "billing:manage"],
  data: ["export:run", "audit:read"],
} as const;

export type GrantableSysPermission =
  (typeof SYS_PERMISSION_GROUPS)[keyof typeof SYS_PERMISSION_GROUPS][number];

export const GRANTABLE_SYS_PERMISSIONS: readonly GrantableSysPermission[] =
  Object.values(SYS_PERMISSION_GROUPS).flat();

/** Jamais délégables (anti-escalade, spec §4) : staff:manage permettrait
 *  l'auto-promotion ; users:impersonate fait hériter TOUS les droits org de la
 *  cible (court-circuite le RBAC système). Admin SYS uniquement. */
export const RESERVED_SYS_PERMISSIONS = [
  "staff:manage",
  "users:impersonate",
] as const;

export type SysPermission =
  | GrantableSysPermission
  | (typeof RESERVED_SYS_PERMISSIONS)[number];

export function isGrantableSysPermission(
  p: string,
): p is GrantableSysPermission {
  return (GRANTABLE_SYS_PERMISSIONS as readonly string[]).includes(p);
}
