import { calcularSaldoRendicion } from './saldo-rendicion';

/**
 * El "saldo" que ve la persona es lo que falta saldar, no la diferencia entre lo
 * adelantado y lo rendido. Caso real: RVI-2026-00008 de DOBA, adelantado
 * 940.000, rendido 921.500, devueltos 18.500 por transferencia al cerrar; la
 * pantalla seguía diciendo "el empleado debe devolver 18.500".
 */
describe('calcularSaldoRendicion', () => {
  it('rendición abierta: lo pendiente es toda la diferencia', () => {
    expect(calcularSaldoRendicion(18_500, [])).toEqual({ diferencia: 18_500, saldado: 0, pendiente: 18_500, pendiente_en_cxp: 0 });
  });

  it('devolución inmediata al cerrar: queda en 0', () => {
    const r = calcularSaldoRendicion(18_500, [{ tipo: 'DEVOLUCION', monto: '18500.00', diferido: false }]);
    expect(r).toMatchObject({ diferencia: 18_500, saldado: 18_500, pendiente: 0 });
  });

  it('reintegro inmediato (la empresa le pagó al empleado): queda en 0', () => {
    const r = calcularSaldoRendicion(-50_000, [{ tipo: 'REINTEGRO', monto: 50_000, diferido: false }]);
    expect(r).toMatchObject({ diferencia: -50_000, saldado: 50_000, pendiente: 0 });
  });

  it('reintegro diferido sin pagar: sigue pendiente, en la cuenta a pagar', () => {
    const r = calcularSaldoRendicion(-50_000, [
      { tipo: 'REINTEGRO', monto: 50_000, diferido: true, cxp_empleado: { monto_original: 50_000, saldo_pendiente: 50_000 } },
    ]);
    expect(r).toMatchObject({ saldado: 0, pendiente: -50_000, pendiente_en_cxp: 50_000 });
  });

  it('reintegro diferido pagado en parte: descuenta lo pagado', () => {
    const r = calcularSaldoRendicion(-50_000, [
      { tipo: 'REINTEGRO', monto: 50_000, diferido: true, cxp_empleado: { monto_original: 50_000, saldo_pendiente: 20_000 } },
    ]);
    expect(r).toMatchObject({ saldado: 30_000, pendiente: -20_000, pendiente_en_cxp: 20_000 });
  });

  it('una devolución anulada no cuenta', () => {
    const r = calcularSaldoRendicion(18_500, [{ tipo: 'DEVOLUCION', monto: 18_500, diferido: false, anulado: true }]);
    expect(r.pendiente).toBe(18_500);
  });

  it('sin diferencia queda en 0', () => {
    expect(calcularSaldoRendicion(0, [])).toMatchObject({ diferencia: 0, pendiente: 0 });
  });
});
