#!/usr/bin/env python3
"""Compose AI4M '¿cuántos agentes?' short: avatar Roberto + cartel superior + b-rolls
full-screen (sincronizados a la voz) + captions SOLO en cara (suprimidas bajo b-rolls).
Replica el pipeline del criterio (cartel band 220px + captions margin_v=380)."""
import subprocess, pathlib, sys
sys.path.insert(0, "/home/clawd/bin/agentsquad-shorts")
from lib import captions

BASE = "/home/clawd/playgrounds/ai4m-dirigir"
AV = f"{BASE}/avatar.mp4"
BROLL = f"{BASE}/brolls"
WORK = pathlib.Path("/tmp/ai4m-dir-work"); WORK.mkdir(exist_ok=True)
OUTF = f"{BASE}/final.mp4"
FONTDIR = "/home/clawd/.fonts/ai4m"

# ventanas mapeadas al VO real (anclas: automatización 15.8 / contenido 35.6·proyectos 37.5·crecimiento 43.6 / Una 64.6·Dos 69.5·Tres 73.9)
BEATS = [
    {"clip": f"{BROLL}/sora.mp4",        "start": 4.0,  "end": 8.0},   # Sora 2 (sin audio por -an) — manager pasivo mirando ("solo la mira trabajar")
    {"clip": f"{BROLL}/caminos.mp4",     "start": 25.5, "end": 33.5},  # opcional vs indispensable
    {"clip": f"{BROLL}/herramienta.mp4", "start": 48.5, "end": 56.5},  # herramienta(pedir/recibir) -> equipo(contexto/prioridades/criterio)
    {"clip": f"{BROLL}/senales.mp4",     "start": 64.5, "end": 75.5},  # las 3 señales (Una/Dos/Tres)
]

def run(cmd):
    r = subprocess.run(cmd, capture_output=True, text=True)
    if r.returncode != 0:
        raise RuntimeError(f"FAILED: {' '.join(map(str,cmd))}\n{r.stderr[-1500:]}")

print("transcribiendo...")
words = captions.transcribe_words(AV)
SCRIPT_TXT = open(f"{BASE}/script.txt").read().strip()
words = captions.align_to_script(words, SCRIPT_TXT)
print(f"  aligned to script -> {len(words)} words")

sup = [(b["start"], b["end"]) for b in BEATS]
ass = WORK / "captions.ass"
captions.build_ass(words, ass, margin_v=380, suppress_windows=sup)

print("normalizando audio...")
audio_norm = WORK / "audio_norm.m4a"
run(["ffmpeg","-y","-i",AV,"-vn","-af","loudnorm=I=-16:TP=-1.5","-ar","44100","-c:a","aac","-b:a","192k",str(audio_norm)])

print("extrayendo b-rolls...")
for i, b in enumerate(BEATS):
    run(["ffmpeg","-y","-i",b["clip"],
         "-vf","scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,fps=30,setsar=1",
         "-an", str(WORK/f"fill{i}.mp4")])

print("componiendo...")
BAND = 220
CARTEL = f"{BASE}/cartel.png"
inputs = ["-i", AV]
for i in range(len(BEATS)):
    inputs += ["-i", str(WORK/f"fill{i}.mp4")]
inputs += ["-i", str(audio_norm)]
inputs += ["-i", CARTEL]
cartel_idx = len(BEATS) + 2
parts = [
    f"[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,fps=30,setsar=1,"
    f"pad=1080:{1920+BAND}:0:{BAND}:color=0x0a0a0a,crop=1080:1920:0:0[shift]",
    f"[shift][{cartel_idx}:v]overlay=0:0[carteled]",
    f"[carteled]subtitles={ass}:fontsdir={FONTDIR}[base]",
]
for i, b in enumerate(BEATS):
    dur = b["end"] - b["start"]
    parts.append(
        f"[{i+1}:v]format=yuva420p,fade=t=in:st=0:d=0.2:alpha=1,"
        f"fade=t=out:st={dur-0.2:.2f}:d=0.2:alpha=1,setpts=PTS+{b['start']:.2f}/TB[ov{i}]")
base = "[base]"
for i, b in enumerate(BEATS):
    lbl = "[v]" if i == len(BEATS)-1 else f"[c{i}]"
    parts.append(f"{base}[ov{i}]overlay=0:0:enable='between(t,{b['start']:.2f},{b['end']:.2f})'{lbl}")
    base = lbl
fc = ";".join(parts)
run(["ffmpeg","-y", *inputs, "-filter_complex", fc,
     "-map","[v]","-map",f"{len(BEATS)+1}:a",
     "-c:v","libx264","-preset","veryfast","-crf","19","-pix_fmt","yuv420p",
     "-c:a","copy","-movflags","+faststart", OUTF])
dur = subprocess.check_output(["ffprobe","-v","error","-show_entries","format=duration","-of","csv=p=0",OUTF]).decode().strip()
print(f"OK -> {OUTF}  ({float(dur):.1f}s)")
