/**
 * Mapeo central de Dominios AI → códigos de módulos / submódulos del sistema.
 *
 * Cada dominio mapea a:
 *  - `modulos`: códigos de módulos raíz (nivel 1). Si la empresa tiene
 *    contratado el módulo en su suscripción, el dominio se activa.
 *  - `submodulos`: códigos de submódulos (nivel 2). Si la empresa tiene
 *    el submódulo activo (vía módulo raíz incluido, no excluido, o addon
 *    contratado), el dominio se activa.
 *
 * Relación OR: alcanza con que coincida AL MENOS UN módulo o submódulo.
 *
 * Cada KPI / alerta / evento de timeline / predicción / contexto de chat
 * debe estar etiquetado con un dominio. Si la empresa no tiene el dominio
 * activo, el dato no se computa ni se devuelve.
 *
 * Reglas de "dueño único" para datos cruzados (evita doble-conteo):
 *  - NC → COBRANZAS (afecta CxC), no VENTAS.
 *  - Margen bruto → VENTAS, no CONTABILIDAD.
 *  - Comisiones → su dominio propio (no VENTAS).
 */
export interface AIDomainMapping {
  modulos?: readonly string[];
  submodulos?: readonly string[];
}

export const AI_DOMAINS = {
  VENTAS: {
    modulos: ['VENTAS'],
    submodulos: [
      'VENTAS_POS',
      'VENTAS_FACTURACION',
      'VENTAS_PEDIDOS',
      'VENTAS_ORDEN_VENTA',
      'VENTAS_PRESUPUESTOS',
      'VENTAS_AUTOFACTURA',
    ],
  },
  COBRANZAS: {
    modulos: ['COBRANZAS'],
    submodulos: [
      'COB_RECIBOS',
      'COB_CUENTAS_COBRAR',
      'COB_PROMESAS',
      'COB_RENDICIONES',
      'VENTAS_NOTAS_CREDITO',
      'ADM_INTERES_MORA',
    ],
  },
  COMPRAS: {
    modulos: ['COMPRAS'],
    submodulos: ['COMP_FACTURAS', 'COMP_ORDENES', 'COMP_PAGOS', 'TES_GASTOS'],
  },
  INVENTARIO: {
    modulos: ['INVENTARIO'],
    submodulos: [
      'INV_STOCK',
      'INV_LOTES',
      'INV_TRANSFERENCIAS',
      'INV_MOVIMIENTOS',
      'INV_AJUSTES',
      'INV_PRODUCTOS',
    ],
  },
  TESORERIA: {
    modulos: ['TESORERIA'],
    submodulos: [
      'TES_MOVIMIENTOS',
      'TES_CAJAS',
      'TES_CHEQUES',
      'TES_CUENTAS',
      'TES_CONCILIACION',
    ],
  },
  CLIENTES: {
    submodulos: ['VENTAS_CLIENTES', 'VENTAS_VENDEDOR_COBRADOR'],
  },
  IMPORTACIONES: {
    modulos: ['IMPORTACIONES'],
    submodulos: ['IMP_EMBARQUES', 'IMP_DESPACHOS', 'IMP_COSTOS'],
  },
  RRHH: {
    modulos: ['RRHH'],
    submodulos: ['RRHH_EMPLEADOS', 'RRHH_LIQUIDACIONES', 'RRHH_MARCACIONES'],
  },
  CONTABILIDAD: {
    modulos: ['CONTABILIDAD'],
    submodulos: ['CONT_ASIENTOS', 'CONT_REPORTES'],
  },
  COMISIONES: {
    submodulos: ['COB_COMISIONES', 'HOL_COMISIONES'],
  },
} as const satisfies Record<string, AIDomainMapping>;

export type AIDomain = keyof typeof AI_DOMAINS;
export const AI_DOMAIN_LIST: AIDomain[] = Object.keys(AI_DOMAINS) as AIDomain[];

/**
 * Dado un código (de módulo o submódulo), retorna los dominios AI que
 * ese código habilita. Útil para tests y para detectar códigos huérfanos.
 */
export function codigoToDomains(codigo: string): AIDomain[] {
  return AI_DOMAIN_LIST.filter((d) => {
    const m = AI_DOMAINS[d] as AIDomainMapping;
    return (
      (m.modulos ?? []).includes(codigo) ||
      (m.submodulos ?? []).includes(codigo)
    );
  });
}

