import { AIDomain, AI_DOMAINS, codigoToDomains } from './ai-domains.config';

/**
 * Reglas de filtrado de respuestas del AI Dashboard según los dominios AI
 * activos de la empresa. Si un dominio no está en `dominios`, sus campos
 * se neutralizan (cero, array vacío, null) o se eliminan del payload.
 *
 * Mapeo de campos de MetricasPeriodo → dominio dueño (regla "dueño único"):
 *   VENTAS:     totalFacturado, ticketPromedio, totalIva, topProductos, rentabilidad, anterior.totalFacturado
 *   COBRANZAS:  totalCobrado, tasaMora, cuentasPorCobrar, topCobradores, notasCredito, anterior.totalCobrado
 *   COMPRAS:    totalCompras, anterior.totalCompras
 *   INVENTARIO: stockCritico, lotesProximosVencer
 *   TESORERIA:  posicionCajaPyg, posicionCajaPorMoneda, chequesProximosACobrar
 *   CLIENTES:   clientesNuevos, anterior.clientesNuevos
 */

const ZERO_NUM = 0;
const EMPTY_ARR: any[] = [];

export function filtrarMetricasPorDominios(metricas: any, dominios: AIDomain[]): any {
  if (!metricas) return metricas;
  const has = (d: AIDomain) => dominios.includes(d);
  const out = { ...metricas, anterior: { ...(metricas.anterior ?? {}) } };

  if (!has('VENTAS')) {
    out.totalFacturado = ZERO_NUM;
    out.ticketPromedio = ZERO_NUM;
    out.totalIva = ZERO_NUM;
    out.topProductos = EMPTY_ARR;
    out.rentabilidad = { costoVentas: 0, margenBruto: 0, margenPct: 0, topPorMargen: [] };
    out.anterior.totalFacturado = ZERO_NUM;
  }
  if (!has('COBRANZAS')) {
    out.totalCobrado = ZERO_NUM;
    out.tasaMora = ZERO_NUM;
    out.cuentasPorCobrar = ZERO_NUM;
    out.topCobradores = EMPTY_ARR;
    out.notasCredito = { cantidad: 0, monto: 0 };
    out.anterior.totalCobrado = ZERO_NUM;
  }
  if (!has('COMPRAS')) {
    out.totalCompras = ZERO_NUM;
    out.anterior.totalCompras = ZERO_NUM;
  }
  if (!has('INVENTARIO')) {
    out.stockCritico = EMPTY_ARR;
    out.lotesProximosVencer = EMPTY_ARR;
  }
  if (!has('TESORERIA')) {
    out.posicionCajaPyg = ZERO_NUM;
    out.posicionCajaPorMoneda = EMPTY_ARR;
    out.chequesProximosACobrar = { cantidad: 0, monto: 0, detalle: [] };
  }
  if (!has('CLIENTES')) {
    out.clientesNuevos = 0;
    out.anterior.clientesNuevos = 0;
  }
  return out;
}

/**
 * Filtra alertas por dominio. Cada alerta tiene un `tipo` con prefijo
 * (ej: "rrhh_*", "cobranza_*", "stock_*", "tesoreria_*"). Si el prefijo
 * mapea a un dominio inactivo, la alerta se descarta.
 */
const ALERT_PREFIX_TO_DOMAIN: Record<string, AIDomain> = {
  rrhh: 'RRHH',
  cobranza: 'COBRANZAS',
  cobro: 'COBRANZAS',
  mora: 'COBRANZAS',
  cxc: 'COBRANZAS',
  venta: 'VENTAS',
  factura: 'VENTAS',
  pos: 'VENTAS',
  nc: 'COBRANZAS',
  compra: 'COMPRAS',
  gasto: 'COMPRAS',
  stock: 'INVENTARIO',
  inventario: 'INVENTARIO',
  lote: 'INVENTARIO',
  tesoreria: 'TESORERIA',
  caja: 'TESORERIA',
  cheque: 'TESORERIA',
  cliente: 'CLIENTES',
  importacion: 'IMPORTACIONES',
  contabilidad: 'CONTABILIDAD',
  comision: 'COMISIONES',
  cuotas: 'COBRANZAS',
  recibo: 'COBRANZAS',
  promesa: 'COBRANZAS',
  rendicion: 'COBRANZAS',
  limite_credito: 'COBRANZAS',
  saldo_cuenta: 'TESORERIA',
  movimiento_tesoreria: 'TESORERIA',
  cierre_caja: 'TESORERIA',
};

export function dominioDeTipo(tipo: string | null | undefined): AIDomain | null {
  if (!tipo) return null;
  const lower = tipo.toLowerCase();
  for (const prefix of Object.keys(ALERT_PREFIX_TO_DOMAIN)) {
    if (lower.startsWith(prefix)) return ALERT_PREFIX_TO_DOMAIN[prefix];
  }
  return null;
}

export function filtrarPorDominios<T extends { tipo?: string | null }>(
  items: T[],
  dominios: AIDomain[],
): T[] {
  return items.filter((it) => {
    const d = dominioDeTipo(it.tipo);
    return d === null || dominios.includes(d);
  });
}

export { AI_DOMAINS, codigoToDomains };
