import { calcItem, calcTotals } from './presupuestos.calc';

describe('Presupuestos — motor de cálculo (Ley 125/91, IVA incluido)', () => {
  it('IVA 10% con descuento de línea: subtotal 180.000 → iva 16.364, base 163.636', () => {
    // 100.000 × 2 × (1 - 10%) = 180.000
    const r = calcItem({ tipo: 'PRODUCTO', cantidad: 2, precio_unitario: 100000, descuento_pct: 10, iva_categoria: 'IVA_10' });
    expect(r.subtotal_con_iva).toBe(180000);
    expect(Math.round(r.monto_iva)).toBe(16364); // 180.000 / 11
    expect(Math.round(r.subtotal_con_iva - r.monto_iva)).toBe(163636);
  });

  it('IVA 5%: 100.000 → iva 4.762', () => {
    const r = calcItem({ tipo: 'PRODUCTO', cantidad: 1, precio_unitario: 100000, descuento_pct: 0, iva_categoria: 'IVA_5' });
    expect(Math.round(r.monto_iva)).toBe(4762); // 100.000 / 21
  });

  it('EXENTO: no genera IVA', () => {
    const r = calcItem({ tipo: 'PRODUCTO', cantidad: 1, precio_unitario: 100000, descuento_pct: 0, iva_categoria: 'EXENTO' });
    expect(r.monto_iva).toBe(0);
    expect(r.subtotal_con_iva).toBe(100000);
  });

  it('SUBTITULO / TEXTO_LIBRE no aportan a los totales', () => {
    expect(calcItem({ tipo: 'SUBTITULO', cantidad: 1, precio_unitario: 999, descuento_pct: 0, iva_categoria: 'IVA_10' }).subtotal_con_iva).toBe(0);
    expect(calcItem({ tipo: 'TEXTO_LIBRE', cantidad: 1, precio_unitario: 999, descuento_pct: 0, iva_categoria: 'IVA_10' }).subtotal_con_iva).toBe(0);
  });

  it('moneda ≠ PYG: precios en USD, descuento global 5% → total US$ 950; equivalente Gs = total × TC 7.400', () => {
    const { totals } = calcTotals(
      [{ tipo: 'PRODUCTO', cantidad: 1, precio_unitario: 1000, descuento_pct: 0, iva_categoria: 'IVA_10' }],
      5,
      7400,
    );
    expect(totals.total_bruto).toBe(1000);
    expect(totals.descuento_global_monto).toBe(50);
    expect(totals.total).toBe(950);
    expect(totals.total_equivalente).toBeCloseTo(7030000, 2); // 950 × 7.400
  });

  it('agrega bases e IVA por categoría', () => {
    const { totals } = calcTotals([
      { tipo: 'PRODUCTO', cantidad: 1, precio_unitario: 110000, descuento_pct: 0, iva_categoria: 'IVA_10' },
      { tipo: 'SERVICIO', cantidad: 1, precio_unitario: 21000, descuento_pct: 0, iva_categoria: 'IVA_5' },
      { tipo: 'PRODUCTO', cantidad: 1, precio_unitario: 50000, descuento_pct: 0, iva_categoria: 'EXENTO' },
    ]);
    expect(Math.round(totals.iva10)).toBe(10000); // 110.000/11
    expect(Math.round(totals.iva5)).toBe(1000); // 21.000/21
    expect(totals.subtotal_exento).toBe(50000);
    expect(totals.total).toBe(181000);
  });
});
