import { cotizacionValida, montoEnMonedaDeCuenta } from './moneda-cuenta.util';

describe('montoEnMonedaDeCuenta', () => {
  it('misma moneda: el total, sin convertir', () => {
    expect(montoEnMonedaDeCuenta({ total: 100.5, monedaDocumento: 'USD', cotizacion: 7300, monedaCuenta: 'USD' })).toEqual({
      ok: true,
      monto: 100.5,
      tipoCambio: 7300,
      convertido: false,
    });
    expect(montoEnMonedaDeCuenta({ total: 800000, monedaDocumento: null, monedaCuenta: 'PYG' })).toMatchObject({
      ok: true,
      monto: 800000,
      tipoCambio: null,
    });
  });

  it('USD desde una cuenta en guaraníes: total × cotización, sin decimales', () => {
    expect(montoEnMonedaDeCuenta({ total: 100.33, monedaDocumento: 'USD', cotizacion: 7312.5, monedaCuenta: 'PYG' })).toEqual({
      ok: true,
      monto: 733663,
      tipoCambio: 7312.5,
      convertido: true,
    });
  });

  it('USD desde guaraníes sin cotización: no adivina', () => {
    const r = montoEnMonedaDeCuenta({ total: 100, monedaDocumento: 'USD', cotizacion: 1, monedaCuenta: 'PYG', nombreCuenta: 'Caja' });
    expect(r).toMatchObject({ ok: false });
    expect((r as any).mensaje).toContain('Falta la cotización del USD');
  });

  it('guaraníes desde una cuenta en dólares: no se permite', () => {
    const r = montoEnMonedaDeCuenta({ total: 500000, monedaDocumento: 'PYG', monedaCuenta: 'USD', nombreCuenta: 'Itaú USD' });
    expect(r).toEqual({
      ok: false,
      mensaje: 'El pago está en guaraníes y la cuenta "Itaú USD" está en USD. Elegí una cuenta en guaraníes.',
    });
  });

  it('dos monedas extranjeras distintas: no se permite', () => {
    const r = montoEnMonedaDeCuenta({ total: 10, monedaDocumento: 'EUR', cotizacion: 8000, monedaCuenta: 'usd' });
    expect(r.ok).toBe(false);
    expect((r as any).mensaje).toContain('en EUR o en guaraníes');
  });
});

describe('cotizacionValida', () => {
  it('descarta vacía, cero, negativa y 1', () => {
    expect([null, undefined, 0, -5, 1, 'x'].map(cotizacionValida)).toEqual([false, false, false, false, false, false]);
    expect(cotizacionValida(7300)).toBe(true);
    expect(cotizacionValida('6.5')).toBe(true);
  });
});
