import { calcularDvRuc, plazoReservaCheckout, validarDatosCheckout } from './store-public.service';

describe('plazoReservaCheckout', () => {
  it('online sin configurar: 1 h de link y la reserva con 5 min de margen', () => {
    expect(plazoReservaCheckout({}, 'online')).toEqual({ horas: 1, minutos: 65 });
  });

  it('manual sin configurar: 24 h para que el comercio confirme', () => {
    expect(plazoReservaCheckout({}, 'manual')).toEqual({ horas: 24, minutos: 1440 });
  });

  it('respeta lo configurado y lo acota a lo que acepta el gateway', () => {
    expect(plazoReservaCheckout({ reservaHorasOnline: 6 }, 'online').horas).toBe(6);
    expect(plazoReservaCheckout({ reservaHorasOnline: 500 }, 'online').horas).toBe(168);
    expect(plazoReservaCheckout({ reservaHorasManual: 48 }, 'manual').horas).toBe(48);
    expect(plazoReservaCheckout({ reservaHorasManual: 'x' }, 'manual').horas).toBe(24);
  });

  it('el reservaMinutos viejo se redondea a horas para el link', () => {
    expect(plazoReservaCheckout({ reservaMinutos: 15 }, 'online').horas).toBe(1);
    expect(plazoReservaCheckout({ reservaMinutos: 150 }, 'online').horas).toBe(3);
  });
});

describe('calcularDvRuc', () => {
  // Pares RUC-DV reales tomados de `personas` (se validaron 300 contra la base de test).
  it.each([
    ['6264957', 4],
    ['80007821', 7],
    ['80080845', 2],
  ])('%s → %i', (ruc, dv) => {
    expect(calcularDvRuc(ruc)).toBe(dv);
  });
});

describe('validarDatosCheckout', () => {
  const ok = { name: 'Juan Pérez', email: 'juan@correo.com.py', phone: '0981 123 456' };
  const dir = { address: 'Mcal. López 1500', departamento: 'ASUNCIÓN', ciudad: 'ASUNCIÓN' };

  it('acepta un comprador completo con delivery', () => {
    expect(validarDatosCheckout(ok, dir, 'delivery')).toEqual([]);
  });

  it('rechaza email y teléfono inservibles', () => {
    const issues = validarDatosCheckout({ name: 'X', email: 'esto-no-es-un-email', phone: '12' }, {}, 'pickup');
    expect(issues).toEqual([
      'Ingresá tu nombre y apellido.',
      'El email no es válido.',
      'El teléfono no es válido (al menos 7 dígitos).',
    ]);
  });

  it('un delivery necesita dirección, departamento y ciudad; un retiro no', () => {
    expect(validarDatosCheckout(ok, {}, 'delivery')).toEqual([
      'Para el delivery falta la dirección, el departamento, la ciudad.',
    ]);
    expect(validarDatosCheckout(ok, {}, 'pickup')).toEqual([]);
  });
});
