import { UserRole } from "./entities/usuario.entity";

export type PermissionLevel = "none" | "read" | "write";
export type PermissionMap = Record<string, PermissionLevel>;

// Fuente unica de los permisos por rol -- antes vivia duplicada en
// permission.guard.ts Y en auth.service.ts (buildPermissions), que ya se
// habian desincronizado una vez con la copia del frontend (providers.tsx,
// que sigue siendo una copia aparte a proposito: no comparte runtime con el
// backend). Las 5 claves "configuracion.<grupo>" espejan uno a uno los
// grupos reales del catalogo (taller-parametros.catalogo.ts, campo
// `grupo`) -- un usuario puede tener, por ejemplo, escritura en
// notificaciones sin tener acceso a facturacion.
export const DEFAULT_PERMISSIONS_BY_ROLE: Record<string, PermissionMap> = {
  [UserRole.SUPER_ADMIN]: {
    usuarios: "write",
    "configuracion.facturacion": "write",
    "configuracion.inventario": "write",
    "configuracion.productos": "write",
    "configuracion.tiendas": "write",
    "configuracion.notificaciones": "write",
    clientes: "write",
    vehiculos: "write",
    ots: "write",
    catalogos: "write",
    productos: "write",
    historial: "write",
    logs: "write",
    sync: "write",
    uploads: "write",
    cotizaciones: "write",
    reportes: "write",
    productoLibre: "write",
  },
  [UserRole.ADMIN]: {
    usuarios: "read",
    "configuracion.facturacion": "write",
    "configuracion.inventario": "write",
    "configuracion.productos": "write",
    "configuracion.tiendas": "write",
    "configuracion.notificaciones": "write",
    clientes: "write",
    vehiculos: "write",
    ots: "write",
    catalogos: "write",
    productos: "write",
    historial: "read",
    logs: "read",
    sync: "write",
    uploads: "write",
    cotizaciones: "write",
    reportes: "write",
    productoLibre: "write",
  },
  [UserRole.OPERATIVO]: {
    usuarios: "none",
    "configuracion.facturacion": "none",
    "configuracion.inventario": "none",
    "configuracion.productos": "none",
    "configuracion.tiendas": "none",
    "configuracion.notificaciones": "none",
    clientes: "read",
    vehiculos: "read",
    ots: "write",
    catalogos: "read",
    productos: "read",
    historial: "read",
    logs: "none",
    sync: "write",
    uploads: "write",
    cotizaciones: "write",
    reportes: "read",
    productoLibre: "none",
  },
  [UserRole.RECEPCION]: {
    usuarios: "none",
    "configuracion.facturacion": "none",
    "configuracion.inventario": "none",
    "configuracion.productos": "none",
    "configuracion.tiendas": "none",
    "configuracion.notificaciones": "none",
    clientes: "read",
    vehiculos: "read",
    ots: "write",
    catalogos: "read",
    productos: "read",
    historial: "read",
    logs: "none",
    sync: "write",
    uploads: "write",
    cotizaciones: "write",
    reportes: "read",
    productoLibre: "none",
  },
  [UserRole.MECANICO]: {
    usuarios: "none",
    "configuracion.facturacion": "none",
    "configuracion.inventario": "none",
    "configuracion.productos": "none",
    "configuracion.tiendas": "none",
    "configuracion.notificaciones": "none",
    clientes: "read",
    vehiculos: "read",
    ots: "write",
    catalogos: "read",
    productos: "read",
    historial: "read",
    logs: "none",
    sync: "write",
    uploads: "write",
    cotizaciones: "write",
    reportes: "none",
    productoLibre: "none",
  },
};

export const GRUPOS_CONFIGURACION = [
  "facturacion",
  "inventario",
  "productos",
  "tiendas",
  "notificaciones",
] as const;

export function nivelConfiguracion(
  permissions: PermissionMap | undefined,
  grupo: string,
): PermissionLevel {
  return permissions?.[`configuracion.${grupo}`] ?? "none";
}

export function tieneAlgunAccesoConfiguracion(
  permissions: PermissionMap | undefined,
): boolean {
  return GRUPOS_CONFIGURACION.some(
    (grupo) => nivelConfiguracion(permissions, grupo) !== "none",
  );
}
