import { armarPartesVision, parsearEvaluacion } from './evaluador-vision';

describe('armarPartesVision', () => {
  it('intercala título/fuente + imagen por candidata y cierra con el producto', () => {
    const partes = armarPartesVision(
      { id: 'p', cod_producto: 'X', descripcion: 'HELADERA SAMSUNG RT32K5', marca: 'SAMSUNG', categoria: null },
      { id: 'p', marca: 'Samsung', modelo: 'RT32K5', tipo: 'heladera', queries: [] },
      [{ jpegBase64: 'AAA', dominio: 'samsung.com', titulo: 'Heladera RT32K5' }],
    );
    expect(partes).toHaveLength(3);
    expect(partes[0]).toEqual({ type: 'text', text: 'Imagen 1 — fuente: samsung.com — título: "Heladera RT32K5"' });
    expect(partes[1]).toEqual({ type: 'image', jpegBase64: 'AAA' });
    expect((partes[2] as any).text).toContain('Samsung RT32K5 — heladera');
    expect((partes[2] as any).text).toContain('Evaluá las 1 imágenes');
  });
});

describe('parsearEvaluacion', () => {
  it('devuelve una evaluación por índice, null donde falta, y normaliza tipos', () => {
    const txt = '[{"i":2,"coincide":"0.8","fondo_blanco":1,"marca_agua":0,"calidad":0.9,"nota":"ok"},{"i":9,"coincide":1}]';
    const r = parsearEvaluacion(txt, 3);
    expect(r[0]).toBeNull();
    expect(r[1]).toEqual({ coincide: 0.8, fondo_blanco: true, marca_agua: false, calidad: 0.9, nota: 'ok' });
    expect(r[2]).toBeNull();
  });
  it('acota valores a [0,1] y recorta la nota a 120', () => {
    const r = parsearEvaluacion(`[{"i":1,"coincide":5,"calidad":-1,"nota":"${'x'.repeat(200)}"}]`, 1);
    expect(r[0]).toMatchObject({ coincide: 1, calidad: 0 });
    expect(r[0]!.nota).toHaveLength(120);
  });
  it('con JSON inválido devuelve todos null', () => {
    expect(parsearEvaluacion('zzz', 2)).toEqual([null, null]);
  });
});
