import { extraerJson } from './json-llm';
import type { EvaluacionVision, ParteMensaje, ProductoParaBuscar, QueriesProducto } from './tipos';

export const PROMPT_VISION = `Evaluás imágenes candidatas para la ficha de un producto en una tienda online. Cada imagen viene con el título y el sitio de donde salió (el título suele traer el modelo exacto: usalo como evidencia). Para cada imagen respondé SOLO un array JSON:
[{ "i": 1, "coincide": 0.0-1.0, "fondo_blanco": true|false, "marca_agua": true|false, "calidad": 0.0-1.0, "nota": "máx 8 palabras" }]

- coincide: probabilidad de que sea el MISMO producto (misma marca y modelo). Si el título de la fuente menciona el modelo y la imagen es consistente → ≥ 0.85. Si el modelo no es legible pero marca, tipo y rasgos visibles (tamaño, color, puertas, forma) coinciden con la descripción → 0.7–0.8. Otra marca, otro modelo o rasgos que contradicen la descripción → ≤ 0.4. Solo accesorios, caja cerrada o repuesto → ≤ 0.3.
- fondo_blanco: fondo blanco o casi blanco uniforme (gris muy claro también vale), sin escenario, personas ni muebles alrededor.
- marca_agua: SOLO elementos agregados por una tienda o sitio: logo de comercio, URL, teléfono, precio, "oferta", "cuotas", texto diagonal semitransparente. NO cuenta como marca de agua: el logo del fabricante en el producto, stickers de fábrica (pulgadas, Smart TV, Full HD, inverter, etiqueta de eficiencia energética), ni la imagen en la pantalla de un televisor.
- calidad: nitidez, producto completo y centrado, sin recortes.`;

export function armarPartesVision(
  p: ProductoParaBuscar,
  n: QueriesProducto,
  imgs: { jpegBase64: string; dominio: string; titulo: string }[],
): ParteMensaje[] {
  const partes: ParteMensaje[] = [];
  imgs.forEach((img, i) => {
    partes.push({ type: 'text', text: `Imagen ${i + 1} — fuente: ${img.dominio} — título: "${img.titulo.slice(0, 120)}"` });
    partes.push({ type: 'image', jpegBase64: img.jpegBase64 });
  });
  partes.push({
    type: 'text',
    text: `Producto: ${n.marca ?? p.marca ?? '(sin marca)'} ${n.modelo ?? ''} — ${n.tipo}. Descripción original del catálogo: "${p.descripcion}". Evaluá las ${imgs.length} imágenes.`,
  });
  return partes;
}

const a01 = (v: unknown) => Math.min(1, Math.max(0, Number(v) || 0));

/** Posición i (1-based en la respuesta) → índice i-1. Devuelve null donde el LLM no evaluó. */
export function parsearEvaluacion(texto: string, cantidad: number): (EvaluacionVision | null)[] {
  const out: (EvaluacionVision | null)[] = Array.from({ length: cantidad }, () => null);
  let items: Array<Record<string, unknown>>;
  try {
    items = extraerJson(texto);
  } catch {
    return out;
  }
  if (!Array.isArray(items)) return out;
  for (const ev of items) {
    const idx = Number(ev?.i) - 1;
    if (!Number.isInteger(idx) || idx < 0 || idx >= cantidad) continue;
    out[idx] = {
      coincide: a01(ev.coincide),
      fondo_blanco: !!ev.fondo_blanco,
      marca_agua: !!ev.marca_agua,
      calidad: a01(ev.calidad),
      nota: typeof ev.nota === 'string' ? ev.nota.slice(0, 120) : undefined,
    };
  }
  return out;
}
