import { CriticidadAlerta, RegistrarAlertaInput } from 'src/alertas-empresa/alertas-empresa.types';

/**
 * Reglas de negocio del Dashboard IA que escriben en la bandeja de alertas de
 * empresa (docs/superpowers/specs/2026-09-15-alertas-fase2-design.md).
 * Una alerta agregada por regla y empresa; `clave === tipo`.
 */
export type ClaveRegla =
  | 'mora_critica'
  | 'limite_credito_superado'
  | 'stock_bajo'
  | 'cheque_por_vencer'
  | 'saldo_cuenta_bajo'
  | 'rrhh_liquidacion_no_cerrada'
  | 'rrhh_empleados_sin_ips'
  | 'rrhh_empleados_sin_cbu'
  | 'rrhh_prestamos_sin_descuento'
  | 'rrhh_vacaciones_vencidas';

export interface ReglaAlerta {
  clave: ClaveRegla;
  modulo: string;
  privilegio: string;
  ruta: string;
  accionSugerida: string;
}

export const REGLAS_ALERTA: Record<ClaveRegla, ReglaAlerta> = {
  mora_critica: {
    clave: 'mora_critica', modulo: 'COBRANZAS', privilegio: 'COB_CC_CUENTA_COBRAR_VER', ruta: '/cobranzas/cuentas-cobrar',
    accionSugerida: 'Coordinar visita del cobrador esta semana. Si supera 60 días considerar gestión judicial.',
  },
  limite_credito_superado: {
    clave: 'limite_credito_superado', modulo: 'COBRANZAS', privilegio: 'COB_CC_CUENTA_COBRAR_VER', ruta: '/cobranzas/cuentas-cobrar',
    accionSugerida: 'Bloquear nuevas ventas a crédito hasta regularizar el saldo.',
  },
  stock_bajo: {
    clave: 'stock_bajo', modulo: 'INVENTARIO', privilegio: 'INV_STK_STOCK_VER', ruta: '/reportes/inventario/stock',
    accionSugerida: 'Realizar pedido de reposición al proveedor.',
  },
  cheque_por_vencer: {
    clave: 'cheque_por_vencer', modulo: 'TESORERIA', privilegio: 'TES_CHQ_CHEQUE_VER', ruta: '/tesoreria-bancos?tab=tes_cheques',
    accionSugerida: 'Depositar los cheques en cuenta bancaria antes de la fecha de vencimiento.',
  },
  saldo_cuenta_bajo: {
    clave: 'saldo_cuenta_bajo', modulo: 'TESORERIA', privilegio: 'TES_CTA_CUENTA_BANCARIA_VER', ruta: '/tesoreria-bancos?tab=tes_cuentas',
    accionSugerida: 'Realizar una transferencia para reponer el saldo antes de emitir pagos.',
  },
  rrhh_liquidacion_no_cerrada: {
    clave: 'rrhh_liquidacion_no_cerrada', modulo: 'RRHH', privilegio: 'RH_LIQ_LIQUIDACION_VER', ruta: '/rrhh?tab=liquidaciones',
    accionSugerida: 'Revisar novedades pendientes y cerrar la liquidación mensual para emitir el reporte IPS y la acreditación bancaria.',
  },
  rrhh_empleados_sin_ips: {
    clave: 'rrhh_empleados_sin_ips', modulo: 'RRHH', privilegio: 'RH_EMP_EMPLEADO_VER', ruta: '/rrhh?tab=empleados',
    accionSugerida: 'Cargar el número de IPS en la ficha del empleado para que aparezca correctamente en el reporte mensual.',
  },
  rrhh_empleados_sin_cbu: {
    clave: 'rrhh_empleados_sin_cbu', modulo: 'RRHH', privilegio: 'RH_EMP_EMPLEADO_VER', ruta: '/rrhh?tab=empleados',
    accionSugerida: 'Cargar el número de cuenta bancaria en la ficha del empleado antes de generar el archivo de acreditación.',
  },
  rrhh_prestamos_sin_descuento: {
    clave: 'rrhh_prestamos_sin_descuento', modulo: 'RRHH', privilegio: 'RH_ANT_PRESTAMO_VER', ruta: '/rrhh?tab=prestamos',
    accionSugerida: 'Revisar si la cuota debe aplicarse o si el préstamo está suspendido.',
  },
  rrhh_vacaciones_vencidas: {
    clave: 'rrhh_vacaciones_vencidas', modulo: 'RRHH', privilegio: 'RH_VAC_VACACION_VER', ruta: '/rrhh?tab=vacaciones',
    accionSugerida: 'Programar el goce de vacaciones para evitar acumulación según Art. 219 del Código Laboral.',
  },
};

export const CLAVES_RRHH = (Object.keys(REGLAS_ALERTA) as ClaveRegla[]).filter((c) => c.startsWith('rrhh_'));

/** Un caso concreto de la regla (cliente, producto, cheque…); va en `datos.items` (≤ 5). */
export interface ItemAlerta {
  id: string;
  nombre: string;
  valor: number | null;
  detalle: string;
}

export const MAX_ITEMS = 5;

export const fmtGs = (n: number) => `Gs. ${Math.round(n).toLocaleString('es-PY')}`;

export function armarAlertaRegla(p: {
  empresaId: string;
  clave: ClaveRegla;
  criticidad: CriticidadAlerta;
  titulo: string;
  descripcion: string;
  cantidad: number;
  total?: number | null;
  items?: ItemAlerta[];
}): RegistrarAlertaInput {
  const regla = REGLAS_ALERTA[p.clave];
  return {
    empresaId: p.empresaId,
    clave: p.clave,
    tipo: p.clave,
    criticidad: p.criticidad,
    titulo: p.titulo,
    descripcion: p.descripcion,
    accionSugerida: regla.accionSugerida,
    modulo: regla.modulo,
    privilegioRequerido: regla.privilegio,
    ruta: regla.ruta,
    sucursalId: null,
    entidadTipo: null,
    entidadId: null,
    datos: { cantidad: p.cantidad, total: p.total ?? null, items: (p.items ?? []).slice(0, MAX_ITEMS) },
    origen: 'regla',
  };
}
