#!/usr/bin/env python3
"""
Bridge do motor Balde C (FIEL ao palmier) para VideoTask.

Contrato (stdin JSON):
  { "workdir": "<dir preparado>" }
onde <workdir> contém, no formato do palmier, os INSUMOS que o motor determinístico
(`unified.py`) lê: `placements.json` (ou `timeline.json`), os JSONs congelados do LLM
(`versions/N_director.json`, `content_inserts.json`, `emotion_inserts.json`, `luma_switches.json`,
`variety_inserts.json`, `missed_inserts.json`, `stab_switches.json`, `keymoment_inserts.json`,
`judge_switches_ok.json`, `content_map.json`, `storyboard.json`) e os caches de percepção
(`facecache/`, `shakecache/`, `zoomcache/`).

Saída (stdout JSON): { "cutpoints": [...], "metrics": {...} } lido de `<workdir>/versions/UNI.json`.

⚠️ Este bridge NÃO inventa corte. Se o workdir não tiver os insumos (percepção da Fase 1 + JSONs
congelados da Fase 2 ainda não gerados), ERRA honesto — melhor falhar claro do que cuspir um corte
ingênuo que não é o balde C validado. Ver BALDE_C_PORT_PLAN.md.
"""
import json, sys, os, subprocess

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))

def error(msg):
    json.dump({"error": msg}, sys.stdout)
    sys.stdout.flush()
    sys.exit(1)

def main():
    raw = sys.stdin.read()
    try:
        data = json.loads(raw)
    except json.JSONDecodeError as e:
        error(f"JSON inválido: {e}")

    workdir = data.get("workdir")
    if not workdir or not os.path.isdir(workdir):
        error("motor fiel exige 'workdir' com os insumos (placements + JSONs congelados + caches). "
              "Percepção (Fase 1) e LLM-freeze (Fase 2) ainda não geram esses insumos — ver "
              "BALDE_C_PORT_PLAN.md. Sem corte ingênuo de fallback (proposital).")

    # Insumo mínimo pro motor determinístico rodar.
    if not (os.path.exists(os.path.join(workdir, "placements.json"))
            or os.path.exists(os.path.join(workdir, "timeline.json"))):
        error(f"workdir sem placements.json/timeline.json: {workdir}")

    unified = os.path.join(SCRIPT_DIR, "unified.py")
    if not os.path.exists(unified):
        error(f"motor não encontrado: {unified}")

    py = sys.executable
    proc = subprocess.run([py, unified], cwd=workdir, capture_output=True, text=True, timeout=600)
    if proc.returncode != 0:
        error(f"unified.py falhou (rc={proc.returncode}): {proc.stderr[-2000:]}")

    uni_path = os.path.join(workdir, "versions", "UNI.json")
    if not os.path.exists(uni_path):
        error(f"motor rodou mas não emitiu {uni_path}. stderr: {proc.stderr[-1000:]}")

    uni = json.load(open(uni_path))
    json.dump({"cutpoints": uni.get("cutpoints", []), "metrics": {"engine": "unified (fiel)"}}, sys.stdout)
    sys.stdout.flush()

if __name__ == "__main__":
    main()
