import { ESTADO_APROBADO_SIFEN, ORIGENES_MOVIMIENTO_CON_ASIENTO_PROPIO } from 'src/contabilidad/services/reglas-contabilizacion';

/**
 * Registry de orígenes contabilizables — seed idempotente.
 *
 * Se ejecuta al bootear el módulo y agrega/actualiza las entradas.
 * Agregar un origen nuevo = agregar una fila a este array.
 *
 * Nomenclatura:
 *  - `origen_tipo`: el mismo string que se usa en `cont_documentos.origen_tipo`
 *    para el par (origen_tipo, origen_id) al confirmar el asiento. Debe coincidir
 *    EXACTO con lo que persiste el service integrador.
 *  - `service_name` / `service_method`: identifican al integrador que sabe generar
 *    el asiento para ese origen. Se resuelven en runtime via ModuleRef.
 *  - `conceptos_req`: mapeos contables mínimos que el integrador necesita. Se
 *    usan en el diagnóstico (Fase 2) para reportar SIN_MAPEO específico.
 */
/**
 * Estilo de invocación del integrador.
 * - "id" (default): method(id)
 * - "id_empresa": method(id, empresaId)
 */
export type ArgStyle = 'id' | 'id_empresa';

export interface RegistryEntry {
  origen_tipo: string;
  descripcion: string;
  modulo: string;
  submodulo?: string;
  tabla_origen: string;
  campo_fecha: string;
  campo_monto?: string;
  campo_numero?: string;
  filtro_extra?: Record<string, unknown>;
  service_name: string;
  service_method: string;
  arg_style?: ArgStyle;
  conceptos_req?: string[];
  orden: number;
}

export const CONT_ORIGEN_REGISTRY_SEED: RegistryEntry[] = [
  // ── Fase 1: 3 orígenes principales ────────────────────────────────────
  {
    origen_tipo: 'factura_cab',
    descripcion: 'Facturas de venta',
    modulo: 'VENTAS',
    submodulo: 'VENTAS_FACTURAS',
    tabla_origen: 'factura_cab',
    campo_fecha: 'dfeemide',
    campo_monto: 'total_factura',
    campo_numero: 'dnumdoc',
    // Solo aprobadas por SIFEN: el integrador no asienta otra cosa. El valor
    // real es 'Aprobado'/'Anulado' (masculino); antes se filtraba 'Anulada' y las
    // anuladas quedaban como pendientes eternas.
    filtro_extra: { estado: ESTADO_APROBADO_SIFEN },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarFacturaVenta',
    // integrarFacturaVenta resuelve todos estos a la vez (más CAJA_GENERAL si es contado).
    conceptos_req: ['CLIENTES', 'VENTAS_10', 'VENTAS_5', 'VENTAS_EXENTAS', 'IVA_DEBITO_10', 'IVA_DEBITO_5'],
    orden: 10,
  },
  {
    origen_tipo: 'gasto_cab',
    descripcion: 'Gastos',
    modulo: 'COMPRAS',
    submodulo: 'COMPRAS_GASTOS',
    tabla_origen: 'gasto_cab',
    campo_fecha: 'fecha_emision',
    campo_monto: 'total',
    campo_numero: 'numero_factura',
    // gasto_cab guarda 'anulado' (no 'anulada') y además el flag `anulado`.
    filtro_extra: { anulado: false, estado: { notIn: ['anulado', 'anulada', 'ANULADO', 'ANULADA'] } },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarGasto',
    conceptos_req: ['GASTOS_GENERALES', 'PROVEEDORES', 'CAJA_GENERAL', 'IVA_CREDITO_10', 'IVA_CREDITO_5'],
    orden: 20,
  },
  {
    // OJO: `origen_tipo` debe coincidir EXACTO con lo que el integrador
    // persiste en `cont_documentos.origen_tipo`. Para tesorería es 'tes_movimientos'
    // (plural), no 'tes_movimiento'. Ver integracion.service.ts:1102.
    origen_tipo: 'tes_movimientos',
    descripcion: 'Movimientos de tesorería',
    modulo: 'TESORERIA',
    tabla_origen: 'tes_movimientos',
    campo_fecha: 'fecha',
    campo_monto: 'monto',
    campo_numero: 'referencia',
    // Los movimientos creados por un gasto, recibo, OP, rendición o transferencia
    // se asientan con ese documento: acá solo entran los manuales, de extracto
    // y ajustes. Misma lista que usa el integrador para negarse a duplicarlos.
    filtro_extra: {
      estado: 'CONFIRMADO',
      OR: [{ origen_tipo: null }, { origen_tipo: { notIn: [...ORIGENES_MOVIMIENTO_CON_ASIENTO_PROPIO] } }],
    },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarMovimientoTesoreria',
    conceptos_req: ['CAJA_GENERAL', 'BANCO'],
    orden: 30,
  },
  {
    origen_tipo: 'imp_despacho',
    descripcion: 'Despachos de importación (cierre)',
    modulo: 'IMPORTACIONES',
    tabla_origen: 'imp_despachos',
    campo_fecha: 'fecha_despacho',
    campo_monto: 'total_tributos_gs',
    campo_numero: 'numero_despacho',
    filtro_extra: { estado: 'CONFIRMADO' },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarCierreDespacho',
    conceptos_req: [],
    orden: 68,
  },
  // ── Fase 4: expansión ────────────────────────────────────────────────
  {
    origen_tipo: 'nota_credito_cab',
    descripcion: 'Notas de crédito de venta',
    modulo: 'VENTAS',
    submodulo: 'VENTAS_NOTAS_CREDITO',
    tabla_origen: 'nota_credito_cab',
    campo_fecha: 'dfeemide',
    campo_numero: 'dnumdoc',
    filtro_extra: { estado: ESTADO_APROBADO_SIFEN },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarNotaCredito',
    // Los que pide integrarNotaCredito. 'NC_EMITIDAS' no existe como concepto:
    // hacía que toda NC diagnosticara "falta mapeo" aunque el mapeo estuviera bien.
    conceptos_req: ['CLIENTES', 'VENTAS_10', 'VENTAS_5', 'VENTAS_EXENTAS', 'IVA_DEBITO_10', 'IVA_DEBITO_5'],
    orden: 40,
  },
  {
    origen_tipo: 'compra_cab',
    descripcion: 'Facturas de compra',
    modulo: 'COMPRAS',
    submodulo: 'COMPRAS_FACTURAS',
    tabla_origen: 'compra_cab',
    campo_fecha: 'fecha_emision',
    campo_monto: 'total',
    campo_numero: 'numero_factura',
    filtro_extra: { estado: { not: 'anulada' } },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarFacturaCompra',
    // Los que pide de verdad integrarFacturaCompra (COMPRAS no se usa): con
    // INVENTARIO fuera de esta lista, una compra con ese mapeo roto diagnosticaba
    // "sin motivo" y el contador no sabía qué arreglar.
    conceptos_req: ['INVENTARIO', 'PROVEEDORES', 'IVA_CREDITO_10', 'IVA_CREDITO_5'],
    orden: 50,
  },
  {
    origen_tipo: 'nota_credito_compra_cab',
    descripcion: 'Notas de crédito de compra',
    modulo: 'COMPRAS',
    submodulo: 'COMPRAS_NOTAS_CREDITO',
    tabla_origen: 'nota_credito_compra_cab',
    campo_fecha: 'fecha_emision',
    campo_monto: 'total',
    campo_numero: 'numero',
    filtro_extra: { estado: { not: 'anulada' } },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarNotaCreditoCompra',
    conceptos_req: ['INVENTARIO', 'PROVEEDORES', 'IVA_CREDITO_10', 'IVA_CREDITO_5'],
    orden: 55,
  },
  {
    origen_tipo: 'recibos_cobro',
    descripcion: 'Recibos de cobro',
    modulo: 'COBRANZAS',
    tabla_origen: 'recibos_cobro',
    campo_fecha: 'fecha_emision',
    campo_monto: 'monto_total',
    campo_numero: 'numero_recibo',
    filtro_extra: { estado: { notIn: ['anulado', 'ANULADO'] }, modo: { not: 'MULTI' } },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarCobro',
    conceptos_req: ['CAJA_GENERAL', 'CLIENTES'],
    orden: 60,
  },
  {
    origen_tipo: 'recibos_multi',
    descripcion: 'Recibos multi-factura',
    modulo: 'COBRANZAS',
    tabla_origen: 'recibos_cobro',
    campo_fecha: 'fecha_emision',
    campo_monto: 'monto_total',
    campo_numero: 'numero_recibo',
    filtro_extra: { estado: { notIn: ['anulado', 'ANULADO'] }, modo: 'MULTI' },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarReciboMulti',
    arg_style: 'id_empresa',
    conceptos_req: ['CAJA_GENERAL', 'CLIENTES'],
    orden: 65,
  },
  {
    origen_tipo: 'pagos_proveedor',
    descripcion: 'Pagos a proveedor',
    modulo: 'COMPRAS',
    tabla_origen: 'pagos_proveedor',
    campo_fecha: 'fecha_pago',
    campo_monto: 'monto',
        filtro_extra: { anulado: false },
service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarPago',
    conceptos_req: ['PROVEEDORES', 'CAJA_GENERAL'],
    orden: 70,
  },
  {
    origen_tipo: 'orden_pago_proveedor_cab',
    descripcion: 'Órdenes de pago a proveedores',
    modulo: 'COMPRAS',
    submodulo: 'COMPRAS_ORDEN_PAGO',
    tabla_origen: 'orden_pago_proveedor_cab',
    campo_fecha: 'fecha_pago',
    campo_monto: 'monto_total',
    campo_numero: 'numero_orden_pago',
    // El integrador solo asienta órdenes PAGADAS; un borrador no es un pago.
    filtro_extra: { activo: true, anulado: false, estado: 'PAGADO' },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarOrdenPago',
    conceptos_req: ['PROVEEDORES', 'CAJA_GENERAL'],
    orden: 75,
  },
  {
    origen_tipo: 'rrhh_liquidacion',
    descripcion: 'Liquidaciones RRHH',
    modulo: 'RRHH',
    submodulo: 'RRHH_LIQUIDACIONES',
    tabla_origen: 'rrhh_liquidaciones_cabecera',
    campo_fecha: 'fecha_calculo',
    campo_monto: 'total_neto',
    filtro_extra: { estado: { in: ['APROBADA', 'PAGADA', 'CERRADA'] } },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarLiquidacionRrhh',
    conceptos_req: ['SUELDOS_JORNALES', 'SUELDOS_A_PAGAR'],
    orden: 80,
  },
  // ── Comisiones y Liquidaciones (Vendedores / Supervisores) ────────
  {
    origen_tipo: 'liquidacion_comisiones_deveng',
    descripcion: 'Devengamiento de comisiones (liquidación vendedor)',
    modulo: 'RRHH',
    submodulo: 'RRHH_COMISIONES',
    tabla_origen: 'liquidaciones_comisiones',
    campo_fecha: 'created_at',
    campo_monto: 'total_comisiones',
    filtro_extra: { tipo: 'vendedor', estado: { notIn: ['anulada', 'ANULADA'] } },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarDevengamientoComisiones',
    arg_style: 'id_empresa',
    conceptos_req: ['GASTO_COMISIONES_VENTAS', 'COMISIONES_A_PAGAR'],
    orden: 82,
  },
  {
    origen_tipo: 'liquidacion_comisiones_pago',
    descripcion: 'Pago de liquidación de comisiones (vendedor)',
    modulo: 'RRHH',
    submodulo: 'RRHH_COMISIONES',
    tabla_origen: 'liquidaciones_comisiones',
    campo_fecha: 'fecha_pago',
    campo_monto: 'total_comisiones',
    filtro_extra: { tipo: 'vendedor', estado: 'pagada' },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarPagoComisiones',
    arg_style: 'id_empresa',
    conceptos_req: ['COMISIONES_A_PAGAR', 'CAJA_GENERAL'],
    orden: 84,
  },
  {
    origen_tipo: 'comision_supervisor',
    descripcion: 'Comisión de supervisor (liquidada)',
    modulo: 'RRHH',
    submodulo: 'RRHH_COMISIONES',
    tabla_origen: 'comisiones_supervisores',
    campo_fecha: 'updated_at',
    campo_monto: 'total_comision',
    filtro_extra: { estado: 'liquidada' },
    service_name: 'ContabilidadIntegracionService',
    service_method: 'integrarComisionSupervisor',
    arg_style: 'id_empresa',
    conceptos_req: ['GASTO_COMISIONES_VENTAS', 'CAJA_GENERAL'],
    orden: 86,
  },
  // ── Viáticos (integradores propios) ────────────────────────────────
  {
    origen_tipo: 'rendicion_adelanto',
    descripcion: 'Adelantos de viáticos',
    modulo: 'RRHH',
    submodulo: 'RRHH_VIATICOS',
    tabla_origen: 'rendicion_adelanto',
    campo_fecha: 'fecha',
    campo_monto: 'monto',
    filtro_extra: { anulado: false },
    service_name: 'RendicionViaticosContabilidadService',
    service_method: 'registrarAdelanto',
    arg_style: 'id_empresa',
    conceptos_req: ['ANTICIPO_VIATICO'],
    orden: 90,
  },
  {
    origen_tipo: 'rendicion_devolucion',
    descripcion: 'Devoluciones / reintegros de viáticos',
    modulo: 'RRHH',
    submodulo: 'RRHH_VIATICOS',
    tabla_origen: 'rendicion_devolucion',
    campo_fecha: 'fecha',
    campo_monto: 'monto',
    filtro_extra: { anulado: false },
    service_name: 'RendicionViaticosContabilidadService',
    service_method: 'registrarDevolucion',
    arg_style: 'id_empresa',
    conceptos_req: ['ANTICIPO_VIATICO'],
    orden: 95,
  },
];
