import { decidirVencimiento } from './vencimiento';

const base = {
  costoMensual: 550000,
  periodoPrueba: 0,
  diasGracia: 5,
  estado: 'Activo',
  fechaFin: new Date('2026-09-01'),
  ahora: new Date('2026-09-25'),
};

describe('decidirVencimiento', () => {
  it('una suscripción paga vencida con gracia vigente pasa a gracia', () => {
    expect(decidirVencimiento({ ...base, fechaFin: new Date('2026-09-23') }).accion).toBe('gracia');
  });

  it('una suscripción paga con la gracia agotada expira', () => {
    expect(decidirVencimiento(base).accion).toBe('expirar');
  });

  it('una suscripción paga sin gracia expira apenas vence', () => {
    expect(decidirVencimiento({ ...base, diasGracia: 0 }).accion).toBe('expirar');
  });

  it('ya en gracia y agotada, expira', () => {
    expect(decidirVencimiento({ ...base, estado: 'EnGracia' }).accion).toBe('expirar');
  });

  // El pedido: una cuenta gratuita no tiene nada que cobrar, así que no vence.
  it('una suscripción gratuita se renueva en vez de expirar', () => {
    expect(decidirVencimiento({ ...base, costoMensual: 0 }).accion).toBe('renovar');
  });

  it('una gratuita ya marcada en gracia también se renueva', () => {
    expect(decidirVencimiento({ ...base, costoMensual: 0, estado: 'EnGracia' }).accion).toBe('renovar');
  });

  it('una prueba gratuita SÍ expira: para eso es una prueba', () => {
    expect(decidirVencimiento({ ...base, costoMensual: 0, periodoPrueba: 7 }).accion).toBe('expirar');
  });

  it('un plan pago bonificado a 0 se trata como gratuito', () => {
    // La cuenta que el comercial dejó en cero: no hay nada que cobrarle.
    expect(decidirVencimiento({ ...base, costoMensual: 0, periodoPrueba: 0 }).accion).toBe('renovar');
  });

  it('un costo nulo se trata como gratuito, no como deuda', () => {
    expect(decidirVencimiento({ ...base, costoMensual: null as unknown as number }).accion).toBe('renovar');
  });

  it('la renovación empuja el vencimiento hacia adelante', () => {
    const r = decidirVencimiento({ ...base, costoMensual: 0 });
    expect(r.nuevaFechaFin).toBeDefined();
    expect(r.nuevaFechaFin!.getTime()).toBeGreaterThan(base.ahora.getTime());
  });
});
