import { crearIntegracionMock } from './__helpers__/integracion-mock';

// Movimiento de tesorería creado por RRHH: el detalle guarda el concepto contable
// (no la cuenta ya resuelta) y el integrador lo resuelve al asentar, sin respaldo.
const mov = (det: any) => ({
  id: 'm1',
  empresa_id: 'emp',
  tipo: 'EGRESO',
  fecha: new Date('2026-10-13'),
  estado: 'CONFIRMADO',
  descripcion: 'Anticipo',
  origen_tipo: null,
  referencia: null,
  created_by: 'u1',
  embarque_id: null,
  tipo_pago_importacion: null,
  cuenta: { cuenta_contable_id: 'cta-banco', moneda: 'PYG' },
  cuenta_id: 'tes1',
  detalles: [
    {
      categoria_id: 'cat',
      monto: 100,
      cuenta_contable_id: null,
      concepto_contable: null,
      categoria: { nombre: 'Anticipo', cuenta_contable_id: 'cta-categoria' },
      ...det,
    },
  ],
});

const integrador = (det: any, faltan: string[] = []) =>
  crearIntegracionMock(
    {
      tes_movimientos: { findUnique: jest.fn().mockResolvedValue(mov(det)) },
      tes_categoria_cuenta_contable: { findMany: jest.fn().mockResolvedValue([]) },
    },
    faltan,
  );

describe('integrarMovimientoTesoreria — concepto contable del detalle', () => {
  it('un detalle con concepto se asienta con el concepto, no con la categoría', async () => {
    const s = integrador({ concepto_contable: 'DESCUENTOS_VARIOS_RRHH' });
    await s.integrarMovimientoTesoreria('m1');
    expect(s.asientos.crearConfirmado.mock.calls[0][3].lineas[0].cuenta_id).toBe('cta-DESCUENTOS_VARIOS_RRHH');
  });

  it('sin el concepto mapeado no cae a la categoría: queda pendiente y avisa', async () => {
    const s = integrador({ concepto_contable: 'SUELDOS_A_PAGAR' }, ['SUELDOS_A_PAGAR']);
    await s.integrarMovimientoTesoreria('m1');
    expect(s.asientos.crearConfirmado).not.toHaveBeenCalled();
    expect(s.avisosMapeo.registrarFaltaMapeo.mock.calls[0][0]).toMatchObject({
      origenTipo: 'tes_movimientos',
      origenId: 'm1',
      conceptos: ['SUELDOS_A_PAGAR'],
    });
  });

  it('la cuenta ya resuelta en el detalle (movimientos viejos) sigue mandando', async () => {
    const s = integrador({ cuenta_contable_id: 'cta-vieja' });
    await s.integrarMovimientoTesoreria('m1');
    expect(s.asientos.crearConfirmado.mock.calls[0][3].lineas[0].cuenta_id).toBe('cta-vieja');
    expect(s.mapeo.getCuentaPorConcepto).not.toHaveBeenCalled();
  });

  it('sin concepto ni cuenta en el detalle usa la categoría como hasta ahora', async () => {
    const s = integrador({});
    await s.integrarMovimientoTesoreria('m1');
    expect(s.asientos.crearConfirmado.mock.calls[0][3].lineas[0].cuenta_id).toBe('cta-categoria');
  });
});
