import { calcularChurn, canceladasEnPeriodo, cobroEstaVencido } from './metricas-holding';

describe('canceladasEnPeriodo', () => {
  const desde = new Date('2026-09-01T00:00:00');
  const hasta = new Date('2026-09-30T23:59:59');

  it('cuenta por la fecha de cancelación, no por la de alta', () => {
    // El caso real: una cuenta vieja que se dio de baja este mes ES churn del mes.
    const subs = [
      { estado: 'Cancelado', created_at: new Date('2026-03-10'), fecha_cancelacion: new Date('2026-09-15') },
    ];
    expect(canceladasEnPeriodo(subs, desde, hasta)).toBe(1);
  });

  it('no cuenta una baja de un mes anterior aunque se haya dado de alta este mes', () => {
    const subs = [
      { estado: 'Cancelado', created_at: new Date('2026-09-02'), fecha_cancelacion: new Date('2026-08-20') },
    ];
    expect(canceladasEnPeriodo(subs, desde, hasta)).toBe(0);
  });

  it('ignora las que no están canceladas', () => {
    const subs = [{ estado: 'Activo', created_at: new Date('2026-09-02'), fecha_cancelacion: null }];
    expect(canceladasEnPeriodo(subs, desde, hasta)).toBe(0);
  });

  it('una cancelada sin fecha registrada no se cuenta ni se rompe', () => {
    // Las bajas históricas quedaron sin fecha: no se pueden atribuir a ningún mes.
    const subs = [{ estado: 'Cancelado', created_at: new Date('2026-09-02'), fecha_cancelacion: null }];
    expect(canceladasEnPeriodo(subs, desde, hasta)).toBe(0);
  });
});

describe('calcularChurn', () => {
  it('es el porcentaje de bajas sobre la base del inicio del período', () => {
    expect(calcularChurn(9, 1)).toBe(10);
  });

  it('sin base no hay churn', () => {
    expect(calcularChurn(0, 0)).toBe(0);
  });

  it('redondea a un decimal', () => {
    expect(calcularChurn(10, 1)).toBe(9.1);
  });
});

describe('cobroEstaVencido', () => {
  const ahora = new Date('2026-09-25T18:06:00');

  it('un cobro que vence HOY todavía no está vencido', () => {
    // fecha_prox_cobro es un DATE: comparar contra la hora actual lo daba por
    // vencido desde las 00:01 del mismo día en que hay que cobrarlo.
    expect(cobroEstaVencido(new Date('2026-09-25'), ahora)).toBe(false);
  });

  it('un cobro de ayer está vencido', () => {
    expect(cobroEstaVencido(new Date('2026-09-24'), ahora)).toBe(true);
  });

  it('un cobro futuro no está vencido', () => {
    expect(cobroEstaVencido(new Date('2026-10-01'), ahora)).toBe(false);
  });

  it('sin fecha no está vencido', () => {
    expect(cobroEstaVencido(null, ahora)).toBe(false);
  });
});
