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

export const LOTE_NORMALIZACION = 20;
const QUERIES_POR_PRODUCTO = 2;

export const PROMPT_NORMALIZAR = `Sos un asistente que prepara búsquedas de imágenes de productos para una tienda de electrodomésticos, herramientas, hogar y tecnología en Paraguay.

Para cada producto recibís: código interno, descripción (abreviada, con prefijos raros tipo "TA/ATO/IMP.BA."), marca y categoría.

Devolvé SOLO un array JSON (sin texto extra) con un objeto por producto:
{ "id": "...", "marca": "Makita" | null, "modelo": "HP333DWYX3" | null, "tipo": "taladro atornillador", "queries": ["...", "..."] }

Reglas:
- "modelo": el código de modelo del FABRICANTE si aparece en el código o la descripción (ej. HP333DWYX3, TKA2M114, WLF752B25F, AVH-295BT). Los códigos internos numéricos cortos (2311, 783-38, 2345) o EAN de 13 dígitos NO son modelo → null.
- El código interno suele llevar un prefijo de categoría de 2–3 letras pegado al modelo real (CGTOK210L → TOK210L, EDRPS8700-N → S8700, HETOKVM213 → VM213, EDTCADDYXL → Caddy XL): quitalo y usá el modelo tal como lo escribe el fabricante. Si dudás, en la query 1 poné el modelo sin prefijo.
- Abreviaturas frecuentes: TRIC = triciclo (moto de carga), JGO = juego, PILET = pileta, VALDE = balde, CEP = cepillo, SEC = secador.
- "tipo": nombre genérico del producto en español, sin abreviaturas (SEC → secador, HELAD → heladera, PLANCH → planchita).
- "queries": exactamente 2 búsquedas para Google Imágenes, ordenadas de más específica a más genérica:
  1) marca + modelo (si hay modelo); si no, marca + tipo + atributos clave (capacidad, medida, color).
  2) tipo + marca + atributos en español natural, sin códigos internos ni prefijos.
- Nunca incluyas prefijos internos ("TA/ATO/IMP.BA.", "BAB", "HE") ni códigos internos en las queries.
- Corregí marcas mal escritas (PIONNER → Pioneer, SAMSUMG → Samsung).`;

export function armarEntradaNormalizacion(productos: ProductoParaBuscar[]): string {
  return productos
    .map((p) => `- id=${p.id} | codigo=${p.cod_producto ?? ''} | descripcion=${p.descripcion} | marca=${p.marca ?? ''} | categoria=${p.categoria ?? ''}`)
    .join('\n');
}

export function parsearNormalizacion(texto: string): Map<string, QueriesProducto> {
  const mapa = new Map<string, QueriesProducto>();
  let items: Partial<QueriesProducto>[];
  try {
    items = extraerJson<Partial<QueriesProducto>[]>(texto);
  } catch {
    return mapa;
  }
  if (!Array.isArray(items)) return mapa;
  for (const n of items) {
    if (!n?.id || !Array.isArray(n.queries) || n.queries.length === 0) continue;
    mapa.set(n.id, {
      id: n.id,
      marca: n.marca ?? null,
      modelo: n.modelo ?? null,
      tipo: n.tipo ?? '',
      queries: n.queries.filter((q) => typeof q === 'string' && q.trim()).slice(0, QUERIES_POR_PRODUCTO),
    });
  }
  return mapa;
}

/** Quita prefijos internos tipo "TA/ATO/IMP.BA." (tokens cortos separados por / o . antes de la primera palabra real). */
function limpiarDescripcion(d: string): string {
  return d.replace(/^(?:[A-Z]{1,4}[/.])+/, '').replace(/\s+/g, ' ').trim();
}

/** Sin LLM (fallo o JSON inválido): marca + código si parece de fábrica, y marca + descripción limpia. */
export function queriesFallback(p: ProductoParaBuscar): QueriesProducto {
  const marca = p.marca && !/^sin marca$/i.test(p.marca) ? p.marca : null;
  const codigo = p.cod_producto?.trim() ?? '';
  const pareceModelo = /[A-Za-z]/.test(codigo) && /\d/.test(codigo) && codigo.length >= 4;
  const desc = limpiarDescripcion(p.descripcion);
  const q1 = pareceModelo ? `${marca ?? ''} ${codigo}`.trim() : `${marca ?? ''} ${desc}`.trim();
  const q2 = `${marca ?? ''} ${desc}`.trim();
  return { id: p.id, marca, modelo: pareceModelo ? codigo : null, tipo: desc, queries: q1 === q2 ? [q1] : [q1, q2] };
}
