"""Dryrun: corre la evaluación IA del nuevo SUPREME contra las 30 alts de p8."""
from apps.editor.models import Project, AISuggestion
from apps.editor.views import _get_project_active_transcript
from apps.core.views import get_workspace_settings
from apps.editor.services import _request_openai_json_response

p = Project.objects.get(pk=8)
src = AISuggestion.objects.filter(project=p, is_active=True).order_by("-updated_at","-id").first()
alts = (src.structured_response or {}).get("alternatives") or []
tr = _get_project_active_transcript(p)
words_by_id = {int(w.id): w for w in tr.words.all()}
settings_obj = get_workspace_settings(p.owner)
api_key = (getattr(settings_obj, "openai_api_key", "") or "").strip()
if not api_key:
    print("NO API KEY"); raise SystemExit

project_brief = {
    "name": str(p.name or "")[:200],
    "description": str(p.description or "")[:1200],
}
cmap = (src.structured_response or {}).get("context_map") or {}
if isinstance(cmap, dict):
    project_brief["context_summary"] = str(cmap.get("summary") or "")[:600]
    raw_contexts = cmap.get("contexts") or []
    if isinstance(raw_contexts, list):
        project_brief["context_blocks"] = [
            {"label": str(c.get("label") or "")[:80], "detail": str(c.get("detail") or "")[:160]}
            for c in raw_contexts[:8] if isinstance(c, dict)
        ]

skip_community = True
skip_promo = True
prefs = [
    "- El usuario NO quiere secuencias dedicadas a interacción con la audiencia, lectura de comentarios, saludos, agradecimientos al canal, ni anuncios de hitos de seguidores. Esas deben marcarse como discard:community.",
    "- El usuario NO quiere secuencias dedicadas a giveaways, sorteos, dinámicas para participar, anuncios repetidos del kit/premio, reglas para ganar. Esas deben marcarse como discard:promo.",
]
system_prompt = (
    "Sos un editor de video que evalúa si una sub-secuencia de un live aporta valor al "
    "objetivo del proyecto. Respondés en JSON estricto con las claves: verdict ('keep' o 'discard'), "
    "category ('core' | 'community' | 'promo' | 'filler' | 'logistics'), score (0-100, "
    "qué tanto aporta al tema central) y reason (una frase breve en español). "
    "Marcá 'keep' si la secuencia muestra contenido sustantivo del tema (entrevistas, "
    "explicaciones, tours, demostraciones, testimonios reales, ambiente del evento). "
    "Marcá 'discard' si es relleno o distracción según las preferencias del usuario."
)

USER_TARGETS = {30,29,23,22,20,18,16,14,13}
print(f"{'IDX':>3} {'EXP':<5} {'GOT':<5} {'CAT':<10} {'SCORE':>5}  REASON")
ok = bad = 0
for i, a in enumerate(alts, 1):
    wids = [int(w) for w in (a.get("word_ids") or []) if int(w) in words_by_id]
    excerpt = " ".join(getattr(words_by_id[wid], "text", "") for wid in wids[:250])
    dur = max(int(a.get("end_ms") or 0) - int(a.get("start_ms") or 0), 0) / 1000
    payload = {
        "instructions": "Evaluá si esta sub-secuencia merece aparecer como una secuencia editada por sí sola, según el proyecto y las preferencias del usuario. Devolvé solo JSON.",
        "project": project_brief,
        "user_preferences": prefs,
        "candidate": {
            "name": str(a.get("sequence_name") or a.get("topic_label") or "")[:200],
            "summary": str(a.get("conversation_summary") or a.get("editorial_rationale") or "")[:600],
            "duration_seconds": round(dur, 1),
            "transcript_excerpt": excerpt[:1800],
        },
    }
    try:
        resp = _request_openai_json_response(
            api_key=api_key, model="gpt-4o-mini",
            system_prompt=system_prompt, user_payload=payload,
            project=p, operation_name="supreme-aporte-eval-dryrun",
            request_timeout_seconds=45,
        )
    except Exception as e:
        print(f"ERR {i}: {e}"); continue
    verdict = str(resp.get("verdict") or "").lower()
    cat = str(resp.get("category") or "")
    score = resp.get("score")
    reason = str(resp.get("reason") or "")[:90]
    expect = "JUNK" if i in USER_TARGETS else "KEEP"
    got = "JUNK" if verdict == "discard" else "KEEP"
    mark = "OK " if expect == got else "MIS"
    if expect == got: ok += 1
    else: bad += 1
    name = (a.get("sequence_name") or "?")[:45]
    print(f"{mark} {i:>2} {expect:<5} {got:<5} {cat:<10} {str(score):>5}  {reason} | {name}")
print(f"\nAciertos {ok}/{len(alts)}  ·  errores {bad}")
