import {
  DIAS_GRACIA_PRUEBA,
  diasRestantesPrueba,
  estadoPrueba,
  metodoEsLectura,
} from './prueba-submodulo';

/** Fecha UTC sin hora, como las guarda una columna DATE. */
const d = (iso: string) => new Date(`${iso}T00:00:00.000Z`);

describe('estadoPrueba', () => {
  const fin = d('2026-10-20');

  it('sin fecha es "activo": la empresa contrató, no está probando', () => {
    expect(estadoPrueba(null)).toBe('activo');
    expect(estadoPrueba(undefined)).toBe('activo');
  });

  it('antes del vencimiento está en prueba', () => {
    expect(estadoPrueba(fin, d('2026-10-01'))).toBe('prueba');
    expect(estadoPrueba(fin, d('2026-10-19'))).toBe('prueba');
  });

  it('el día del vencimiento todavía está en prueba: vence al final del día', () => {
    expect(estadoPrueba(fin, d('2026-10-20'))).toBe('prueba');
  });

  it('el día siguiente pasa a solo lectura', () => {
    expect(estadoPrueba(fin, d('2026-10-21'))).toBe('solo_lectura');
  });

  it('sigue en solo lectura hasta el último día de gracia', () => {
    expect(estadoPrueba(fin, d('2026-11-19'))).toBe('solo_lectura'); // +30
  });

  it('al día 31 se bloquea', () => {
    expect(estadoPrueba(fin, d('2026-11-20'))).toBe('bloqueado'); // +31
    expect(estadoPrueba(fin, d('2027-01-01'))).toBe('bloqueado');
  });

  it('la hora del día no mueve el estado', () => {
    const tarde = new Date('2026-10-20T23:59:59.000Z');
    const temprano = new Date('2026-10-20T00:00:01.000Z');
    expect(estadoPrueba(fin, tarde)).toBe('prueba');
    expect(estadoPrueba(fin, temprano)).toBe('prueba');
  });

  it('respeta una gracia distinta si se la pasan', () => {
    expect(estadoPrueba(fin, d('2026-10-25'), 3)).toBe('bloqueado');
    expect(estadoPrueba(fin, d('2026-10-22'), 3)).toBe('solo_lectura');
  });

  it('la gracia por defecto son 30 días', () => {
    expect(DIAS_GRACIA_PRUEBA).toBe(30);
  });
});

describe('diasRestantesPrueba', () => {
  it('cuenta los días que faltan', () => {
    expect(diasRestantesPrueba(d('2026-10-20'), d('2026-10-13'))).toBe(7);
    expect(diasRestantesPrueba(d('2026-10-20'), d('2026-10-20'))).toBe(0);
  });

  it('da negativo si ya venció', () => {
    expect(diasRestantesPrueba(d('2026-10-20'), d('2026-10-25'))).toBe(-5);
  });

  it('sin fecha devuelve null', () => {
    expect(diasRestantesPrueba(null)).toBeNull();
  });
});

describe('metodoEsLectura', () => {
  it('deja pasar sólo lo que no modifica', () => {
    expect(metodoEsLectura('GET')).toBe(true);
    expect(metodoEsLectura('head')).toBe(true);
    expect(metodoEsLectura('OPTIONS')).toBe(true);
    for (const m of ['POST', 'PUT', 'PATCH', 'DELETE']) {
      expect(metodoEsLectura(m)).toBe(false);
    }
  });
});
