import { FiltroCierre, leerMarca } from './cierre';
import { extraccionDirecta } from './extraccion';

function pasar(deltas: string[]) {
  const f = new FiltroCierre();
  const emitido = deltas.map((d) => f.agregar(d)).join('');
  const fin = f.finalizar();
  return { emitido: emitido + fin.pendiente, ...fin };
}

describe('FiltroCierre', () => {
  it('recorta la marca aunque llegue partida entre deltas', () => {
    const r = pasar(['Tu factura está rechazada.\n', '[', '[cie', 'rre:autoservicio|documento_sifen|ninguno]]']);
    expect(r.emitido).toBe('Tu factura está rechazada.\n');
    expect(r.visible).toBe('Tu factura está rechazada.');
    expect(r.cierre).toEqual({ resultado: 'autoservicio', categoria: 'documento_sifen', motivo: null });
  });

  it('un corchete normal no se pierde', () => {
    const r = pasar(['Mirá la columna [Sifen', '] de la lista.']);
    expect(r.emitido).toBe('Mirá la columna [Sifen] de la lista.');
    expect(r.cierre).toBeNull();
  });

  it('sin marca: todo el texto, cierre null', () => {
    const r = pasar(['Hola', ', ¿en qué te ayudo?']);
    expect(r.emitido).toBe('Hola, ¿en qué te ayudo?');
    expect(r.cierre).toBeNull();
  });

  it('marca con motivo; valores desconocidos caen a neutros', () => {
    expect(leerMarca('x [[cierre:no_resuelto|documento_sifen|trabado_sifen]]')).toEqual({
      resultado: 'no_resuelto',
      categoria: 'documento_sifen',
      motivo: 'trabado_sifen',
    });
    expect(leerMarca('[[cierre:resuelto|inventada|tampoco]]')).toEqual({
      resultado: 'resuelto',
      categoria: 'otro',
      motivo: null,
    });
    expect(leerMarca('[[cierre:ganar|otro|ninguno]]')).toBeNull();
  });
});

describe('extraccionDirecta', () => {
  it('número completo o CDC: sin extractor', () => {
    expect(extraccionDirecta('mi nota de crédito 001-002-0000593')).toEqual({
      intencion: 'consulta_dato',
      tipoDocumento: 'NOTA_CREDITO',
      referencia: '001-002-0000593',
      categoria: 'documento_sifen',
    });
  });

  it('número suelto o sin número: se usa el extractor', () => {
    expect(extraccionDirecta('la factura 123')).toBeNull();
    expect(extraccionDirecta('¿cómo anulo una factura?')).toBeNull();
  });
});
