import type { CandidataImagen, EvaluacionVision } from './tipos';

/** Score mínimo para guardar una candidata como sugerencia (deja ver dudosas, descarta basura). */
export const UMBRAL_GUARDAR = 0.55;
/** Coincidencia mínima para que una sugerencia sea "aprobable" (verde, entra en aprobación masiva). */
export const UMBRAL_COINCIDE = 0.7;
export const SCORE_APROBACION_MASIVA_DEFAULT = 0.9;
/** Máximo de sugerencias guardadas por producto en una búsqueda. */
export const MAX_SUGERIDAS_POR_PRODUCTO = 5;
/** Mismo tope que la carga manual en ProductosService.addImagen. */
export const MAX_IMAGENES_POR_PRODUCTO = 5;

export function calcularScore(v: EvaluacionVision): number {
  const s = v.coincide * 0.6 + (v.fondo_blanco ? 0.25 : 0) + v.calidad * 0.15 - (v.marca_agua ? 0.5 : 0);
  return Math.min(1, Math.max(0, s));
}

export function esAprobable(v: EvaluacionVision): boolean {
  return v.coincide >= UMBRAL_COINCIDE && v.fondo_blanco && !v.marca_agua;
}

/** Candidatas evaluadas con score ≥ umbral, mejores primero, hasta MAX_SUGERIDAS_POR_PRODUCTO. */
export function seleccionarParaGuardar(candidatas: CandidataImagen[]): CandidataImagen[] {
  return candidatas
    .filter((c) => c.vision && !c.descarte)
    .map((c) => ({ ...c, score: c.score ?? calcularScore(c.vision!) }))
    .filter((c) => c.score! >= UMBRAL_GUARDAR)
    .sort((a, b) => b.score! - a.score!)
    .slice(0, MAX_SUGERIDAS_POR_PRODUCTO);
}
