import { ContabilidadIntegracionService } from './integracion.service';

/**
 * Cuando el documento no guarda quién lo cargó, el asiento pasaba el id de la
 * EMPRESA como si fuera el usuario. `cont_asientos.usuario_id` apunta a la tabla
 * de usuarios, así que el insert moría con
 * `cont_asientos_usuario_id_fkey` y el documento quedaba sin contabilizar para
 * siempre, sin aviso.
 *
 * Encontrado en DOBA: 1 de sus 6 pagos a proveedor no tiene usuario_id y nunca
 * llegó a la contabilidad.
 */
describe('El asiento de un documento sin usuario va sin usuario, no con la empresa', () => {
  const armar = () => {
    const crearConfirmado = jest.fn().mockResolvedValue({ id: 'as-1' });
    const service = Object.create(ContabilidadIntegracionService.prototype) as any;
    service.logger = { log: jest.fn(), warn: jest.fn(), error: jest.fn() };
    service.asientos = { crearConfirmado };
    service.periodos = { resolverPeriodoPorFecha: jest.fn().mockResolvedValue('per-1') };
    service.mapeo = { getCuentaPorConcepto: jest.fn().mockResolvedValue('cta-1') };
    service.mediosPago = { resolverPorMedio: jest.fn().mockResolvedValue(new Map()) };
    service.resolverCuentaPasivo = jest.fn().mockResolvedValue('cta-prov');
    service.tieneModuloContabilidad = jest.fn().mockResolvedValue(true);
    return { service, crearConfirmado };
  };

  const prismaPara = (pago: any) => ({
    pagos_proveedor: { findUnique: jest.fn().mockResolvedValue(pago) },
    cont_documentos: { findFirst: jest.fn().mockResolvedValue(null) },
    $transaction: jest.fn().mockImplementation((fn: any) =>
      fn({ cont_documentos: { create: jest.fn().mockResolvedValue({ id: 'doc-1' }) } }),
    ),
  });

  const pagoBase = {
    id: 'pago-1',
    empresa_id: 'emp-1',
    proveedor_id: 'prov-1',
    monto: 1_250_000,
    fecha_pago: new Date('2026-09-10'),
    numero_recibo: '001-001-0000010',
    medio_pago_id: null,
    cotizacion: 1,
    cuentas_pagar: { cuenta_pasivo_id: 'cta-prov' },
    moneda: { codigo: 'PYG' },
  };

  it('pago sin usuario: el asiento se crea con usuario null', async () => {
    const { service, crearConfirmado } = armar();
    service.prisma = prismaPara({ ...pagoBase, usuario_id: null });

    await service.integrarPago('pago-1');

    expect(crearConfirmado).toHaveBeenCalled();
    const usuarioId = crearConfirmado.mock.calls[0][1];
    expect(usuarioId).toBeNull();
    // Lo que rompía: mandar el id de la empresa en el lugar del usuario.
    expect(usuarioId).not.toBe('emp-1');
  });

  it('pago con usuario: se respeta quién lo cargó', async () => {
    const { service, crearConfirmado } = armar();
    service.prisma = prismaPara({ ...pagoBase, usuario_id: 'usr-7' });

    await service.integrarPago('pago-1');

    expect(crearConfirmado.mock.calls[0][1]).toBe('usr-7');
  });
});
