import { desglosarComision } from './regimen-comision';

/**
 * El contador de DOBA pidió que las comisiones "lleven IVA". Es cierto sólo si
 * el comisionista es un tercero que factura su servicio: la comisión de un
 * empleado es remuneración y no genera IVA ni comprobante.
 *
 * Como una misma empresa puede tener de los dos, el régimen lo declara cada
 * vendedor y el sistema no elige por nadie.
 */
describe('desglosarComision', () => {
  it('empleado: todo es gasto, sin IVA', () => {
    expect(desglosarComision(1_000_000, 'EMPLEADO')).toEqual({
      base: 1_000_000,
      iva: 0,
      aPagar: 1_000_000,
      conIva: false,
    });
  });

  it('sin régimen declarado se comporta como antes: sin IVA', () => {
    // Es lo que tienen hoy todos los vendedores cargados: el despliegue no puede
    // cambiarle el asiento a nadie.
    expect(desglosarComision(1_000_000, null).conIva).toBe(false);
    expect(desglosarComision(1_000_000, undefined).aPagar).toBe(1_000_000);
  });

  it('externo con IVA incluido: separa el IVA de adentro y se le paga lo mismo', () => {
    const d = desglosarComision(1_100_000, 'EXTERNO_IVA_INCLUIDO');

    expect(d.base).toBe(1_000_000);
    expect(d.iva).toBe(100_000);
    // Lo que factura es el total calculado: no se le paga de más.
    expect(d.aPagar).toBe(1_100_000);
    expect(d.conIva).toBe(true);
  });

  it('externo con IVA aparte: el IVA se suma y se le paga más', () => {
    const d = desglosarComision(1_000_000, 'EXTERNO_IVA_ADICIONAL');

    expect(d.base).toBe(1_000_000);
    expect(d.iva).toBe(100_000);
    expect(d.aPagar).toBe(1_100_000);
  });

  it('el asiento cuadra en los tres regímenes', () => {
    for (const regimen of [null, 'EMPLEADO', 'EXTERNO_IVA_INCLUIDO', 'EXTERNO_IVA_ADICIONAL']) {
      const d = desglosarComision(1_234_567, regimen);
      expect(d.base + d.iva).toBeCloseTo(d.aPagar, 2);
    }
  });

  it('una comisión en cero no arma ninguna línea de IVA', () => {
    expect(desglosarComision(0, 'EXTERNO_IVA_ADICIONAL').conIva).toBe(false);
  });

  it('usa el redondeo que le pasa el servicio', () => {
    const d = desglosarComision(1_000_000, 'EXTERNO_IVA_INCLUIDO', (v) => Math.round(v));

    expect(Number.isInteger(d.base)).toBe(true);
    expect(d.base + d.iva).toBe(d.aPagar);
  });
});
