"""
Reune en un solo .txt los PROMPTS de todas las imagenes APROBADAS de un pool.

Cada PNG de APROBADO/ tiene un prompt que se busca asi, por orden de prioridad:
  1. regen_*.json  -> prompt corregido a mano (la version buena)
  2. manifest del lote --all -> prompt original con el que se genero

Marca cuales siguen la especificacion nueva de hombre y cuales son los antiguos,
para que se vea de un vistazo que prompts hay que regenerar.

    python Engine/dump_aprobados.py                     # explicit
    python Engine/dump_aprobados.py --pool spicy
"""
import argparse
import json
import re
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
TEST_BLOCKS = BASE_DIR / "Output" / "test_blocks"

# la especificacion nueva del hombre (07-10-2026)
NEW_MALE = re.compile(
    r"1boy,\s*\(faceless male:1\.4\),\s*muscular body"
    r"(,\s*broad shoulders)?(,\s*taller male)?")
FULL_BODY = ("full body", "wide shot", "whole body visible",
             "both characters fully visible")


def load_all_prompts():
    """-> {nombre_png: prompt}. Busca en TODOS los manifests, no solo los del
    pool: algunas imagenes fueron generadas en corridas viejas cuyo manifest
    quedo en la raiz de Output/test_blocks/ y su pool no era subcarpeta."""
    out = {}
    for m in sorted(TEST_BLOCKS.rglob("manifest_*.json")):
        try:
            data = json.loads(m.read_text(encoding="utf-8-sig"))
        except Exception:
            continue
        for e in data:
            f = e.get("file", "")
            if f and f not in out and e.get("prompt"):
                out[f] = e["prompt"]
    return out


def main():
    p = argparse.ArgumentParser(description="Volcado de prompts APROBADOS")
    p.add_argument("--pool", default="explicit")
    args = p.parse_args()

    appr = TEST_BLOCKS / args.pool / "APROBADO"
    if not appr.is_dir():
        raise SystemExit(f"[!] No existe {appr}")

    pngs = sorted(f.name for f in appr.glob("*.png"))

    # prompts corregidos a mano
    regen = {}
    for j in appr.glob("regen_*.json"):
        try:
            d = json.loads(j.read_text(encoding="utf-8-sig"))
        except Exception:
            continue
        if d.get("file"):
            regen[d["file"]] = d.get("prompt", "")

    batch = load_all_prompts()

    rows = []
    for png in pngs:
        prompt = regen.get(png) or batch.get(png, "")
        if not prompt:
            rows.append((png, "", "SIN PROMPT"))
            continue
        new_spec = bool(NEW_MALE.search(prompt))
        has_cam = any(t in prompt for t in FULL_BODY)
        tag = "NUEVO" if new_spec else "antiguo"
        if has_cam:
            tag += " +tags camara"
        rows.append((png, prompt, tag))

    out = appr / f"prompts_aprobados_{args.pool}.txt"
    lines = [
        f"# PROMPTS APROBADOS de {args.pool} ({len(pngs)} imagenes)",
        f"# en Output/test_blocks/{args.pool}/APROBADO/",
        "# formato: <nombre del png>:\\n\\n<prompt>\\n",
        "#",
        "# 'NUEVO'    = Corresponde con la especificacion actual del hombre",
        "#             (1boy, (faceless male:1.4), muscular body, [broad shoulders],",
        "#              [taller male]) y sin tags de cuerpo completo.",
        "# 'antiguo'  = Especificacion larga de hombre + tags de camara. La imagen",
        "#              fue aprobada asi, pero si la quieres con la nueva",
        "#              especificacion hay que regenerarla.",
        "",
    ]
    for png, prompt, tag in rows:
        lines.append(f"{png}:")
        lines.append("")
        lines.append(f"[{tag}]")
        lines.append(prompt)
        lines.append("")
        lines.append("-" * 78)
        lines.append("")
    out.write_text("\n".join(lines), encoding="utf-8")

    nuevos = sum(1 for _, _, t in rows if t.startswith("NUEVO") and "camara" not in t)
    viejos = sum(1 for _, _, t in rows if t.startswith("antiguo"))
    cam = sum(1 for _, _, t in rows if "camara" in t)
    print(f"[OK] {len(pngs)} prompts -> {out.relative_to(BASE_DIR)}")
    print(f"    NUEVO (spec actual, sin camara) : {nuevos}")
    print(f"    antiguo (spec larga + camara)    : {viejos}")
    print(f"    con tags de camara              : {cam}")
    print()
    for png, _, tag in rows:
        print(f"    {png:48} [{tag}]")


if __name__ == "__main__":
    main()