import { costoMensualDeSuscripcion } from './costo-mensual';

describe('costoMensualDeSuscripcion', () => {
  it('respeta el precio acordado por encima del precio de lista del plan', () => {
    // El caso real: plan de 550.000, acordado 300.000 al crear la cuenta.
    expect(costoMensualDeSuscripcion({ precioVenta: 300000, precioPlan: 550000, adicionales: 0 })).toBe(300000);
  });

  it('le suma los módulos adicionales al precio acordado', () => {
    expect(costoMensualDeSuscripcion({ precioVenta: 300000, precioPlan: 550000, adicionales: 80000 })).toBe(380000);
  });

  it('sin precio acordado cae al precio de lista del plan', () => {
    expect(costoMensualDeSuscripcion({ precioVenta: null, precioPlan: 550000, adicionales: 0 })).toBe(550000);
  });

  it('sin precio acordado también suma los adicionales', () => {
    expect(costoMensualDeSuscripcion({ precioVenta: null, precioPlan: 550000, adicionales: 20000 })).toBe(570000);
  });

  it('un acordado de cero es un acuerdo válido, no "sin precio"', () => {
    // Una cuenta bonificada: 0 es un precio, no un campo vacío.
    expect(costoMensualDeSuscripcion({ precioVenta: 0, precioPlan: 550000, adicionales: 0 })).toBe(0);
  });

  it('acepta Decimal de Prisma', () => {
    const dec = (n: number) => ({ toString: () => String(n), valueOf: () => n });
    expect(costoMensualDeSuscripcion({ precioVenta: dec(300000), precioPlan: dec(550000), adicionales: 0 })).toBe(
      300000,
    );
  });

  it('valores basura no rompen el cálculo', () => {
    expect(costoMensualDeSuscripcion({ precioVenta: undefined, precioPlan: undefined, adicionales: NaN })).toBe(0);
  });

  it('nunca devuelve negativo', () => {
    expect(costoMensualDeSuscripcion({ precioVenta: -100, precioPlan: 550000, adicionales: 0 })).toBe(0);
  });
});
