import { armarEntradaNormalizacion, parsearNormalizacion, queriesFallback } from './normalizador-queries';

const p = { id: 'p1', cod_producto: 'CGTOK210L', descripcion: 'CONGELADOR VERTICAL TOKYO 210LTS', marca: 'TOKYO', categoria: 'Congeladores' };

describe('armarEntradaNormalizacion', () => {
  it('una línea por producto con id, código, descripción, marca y categoría', () => {
    const txt = armarEntradaNormalizacion([p, { ...p, id: 'p2', cod_producto: null, marca: null, categoria: null }]);
    expect(txt.split('\n')).toHaveLength(2);
    expect(txt).toContain('id=p1 | codigo=CGTOK210L | descripcion=CONGELADOR VERTICAL TOKYO 210LTS | marca=TOKYO | categoria=Congeladores');
    expect(txt).toContain('id=p2 | codigo= | descripcion=');
  });
});

describe('parsearNormalizacion', () => {
  it('acepta JSON con fences y recorta a 2 queries', () => {
    const txt = '```json\n[{"id":"p1","marca":"Tokyo","modelo":"TOK210L","tipo":"congelador vertical","queries":["a","b","c"]}]\n```';
    const m = parsearNormalizacion(txt);
    expect(m.get('p1')).toEqual({ id: 'p1', marca: 'Tokyo', modelo: 'TOK210L', tipo: 'congelador vertical', queries: ['a', 'b'] });
  });
  it('ignora entradas sin id o sin queries y devuelve vacío con JSON inválido', () => {
    expect(parsearNormalizacion('[{"marca":"x"},{"id":"p2","queries":"no"}]').size).toBe(0);
    expect(parsearNormalizacion('no es json').size).toBe(0);
  });
});

describe('queriesFallback', () => {
  it('con código alfanumérico usa marca + código y marca + descripción limpia', () => {
    expect(queriesFallback(p).queries).toEqual(['TOKYO CGTOK210L', 'TOKYO CONGELADOR VERTICAL TOKYO 210LTS']);
  });
  it('sin código ni marca usa la descripción limpia de prefijos', () => {
    const q = queriesFallback({ id: 'x', cod_producto: '2311', descripcion: 'TA/ATO/IMP.BA.MAKITA HP333DWYX3 12V', marca: null, categoria: null });
    expect(q.modelo).toBeNull();
    expect(q.queries[0]).toBe('MAKITA HP333DWYX3 12V');
  });
});
