import { formatearReferencia, normalizarReferencia, normalizarReferenciaExtraida } from './normalizar-referencia';

describe('normalizarReferencia', () => {
  it.each([
    ['001-001-0000123', '001', '001', '0000123'],
    ['1-1-123', '001', '001', '0000123'],
    ['001 - 002 - 593', '001', '002', '0000593'],
    ['mi factura 001-001-0001010 salió rechazada', '001', '001', '0001010'],
    ['0010010000123', '001', '001', '0000123'],
    ['la 001–001–45', '001', '001', '0000045'],
  ])('número completo: %s', (texto, est, pun, num) => {
    expect(normalizarReferencia(texto)).toEqual({
      clase: 'numero',
      establecimiento: est,
      puntoExpedicion: pun,
      numero: num,
    });
  });

  it.each([
    ['factura 123', '0000123'],
    ['la 0000272 no me aparece', '0000272'],
    ['272', '0000272'],
    ['la factura 552 del 15/10/2026', '0000552'],
  ])('solo número: %s', (texto, num) => {
    expect(normalizarReferencia(texto)).toEqual({ clase: 'numero', numero: num });
  });

  it('CDC de 44 dígitos, también en grupos de 4', () => {
    const cdc = '01801443150010010001010122026101512345678901';
    expect(normalizarReferencia(`cdc ${cdc}`)).toEqual({ clase: 'cdc', cdc });
    const agrupado = cdc.replace(/(\d{4})/g, '$1 ').trim();
    expect(normalizarReferencia(agrupado)).toEqual({ clase: 'cdc', cdc });
  });

  it.each([
    ['', 'vacío'],
    ['hola, necesito ayuda', 'sin números'],
    ['la 123 y la 456', 'dos números: ambiguo'],
    ['del 15-10-2026', 'fecha con guiones no es un documento'],
    ['0', 'cero'],
    ['las facturas del RUC 80144315-5', 'un RUC con dígito verificador no es un documento'],
    ['RUC 80144315 - 5', 'ídem, con espacios'],
  ])('null: %s (%s)', (texto) => {
    expect(normalizarReferencia(texto)).toBeNull();
  });

  it('formatearReferencia', () => {
    expect(formatearReferencia(normalizarReferencia('1-1-123')!)).toBe('001-001-0000123');
    expect(formatearReferencia(normalizarReferencia('123')!)).toBe('0000123');
  });
});

describe('normalizarReferenciaExtraida (campo referencia del extractor)', () => {
  it.each([
    ['001-002-593', '001-002-0000593 completo'],
    ['punto 002, número 593', '0000593'],
    ['nro 45', '0000045'],
    ['la 77', '0000077'],
  ])('%s', (ref) => {
    const r = normalizarReferenciaExtraida(ref);
    expect(r?.clase).toBe('numero');
  });

  it('toma el número que sigue a "número" aunque haya otros', () => {
    expect(normalizarReferenciaExtraida('punto 002, número 593')).toEqual({ clase: 'numero', numero: '0000593' });
  });

  it('un RUC no es un número de documento', () => {
    expect(normalizarReferenciaExtraida('RUC 80144315-5')).toBeNull();
    expect(normalizarReferenciaExtraida('')).toBeNull();
  });
});
