# INSTRUMENT-AUSNAHME: Victor-Go — Holmes/Watson Dialog komplett neu, SSML-Pausen + neue Atmo
"""
Regeneriert alle 20 Dialog-Clips mit 700ms SSML-Pausen vor/nach dem Text.
Generiert neue Atmo (warm, kein Kratzen).
Ruft danach watson_dialog_mix.py auf.
"""
import json, time, urllib.request, urllib.error, subprocess
from pathlib import Path

API_KEY = "sk_cac6e576af419777a078b639869a5b3f36ae04eca65d6e37"
CLIPS   = Path("/Users/victorholland/Vibe Coding/dispatcher/cockpit/watson_demo_clips")
LOG     = Path("/tmp/watson_regen.log")
MODEL   = "eleven_multilingual_v2"

WATSON = "T080SqoEEtD27526TTTa"
HOLMES = "kMg8CgFduU4YUWmbRBx1"

def s(stability, similarity, style=0.0):
    return {"stability": stability, "similarity_boost": similarity,
            "style": style, "use_speaker_boost": True}

DIALOG = [
    ("d01","watson", WATSON, s(0.40,0.82,0.55), "Holmes. Ich brauche eine Erklärung. Jetzt."),
    ("d02","holmes_trim",HOLMES, s(0.60,0.88,0.30), "Watson, Sie vergeuden meine Zeit."),
    ("d03","watson", WATSON, s(0.35,0.84,0.62), "Und Sie vergeuden meine Geduld. Was haben Sie gefunden?"),
    ("d04","holmes_trim",HOLMES, s(0.65,0.87,0.25), "Nichts. Oder vielmehr — alles."),
    ("d05","watson", WATSON, s(0.38,0.83,0.58), "Das ist keine Antwort."),
    ("d06","holmes_trim",HOLMES, s(0.68,0.88,0.22), "Es ist die einzige Antwort, die zählt."),
    ("d07","watson", WATSON, s(0.25,0.87,0.80), "Reden Sie Klartext!"),
    ("d08","holmes_trim",HOLMES, s(0.58,0.89,0.35), "Der Mann war nicht allein in dieser Nacht. Vier Beweise. Möchten Sie sie hören?"),
    ("d09","watson", WATSON, s(0.22,0.88,0.85), "Natürlich!"),
    ("d10","holmes_trim",HOLMES, s(0.60,0.88,0.30), "Erstens: Der Staub auf dem linken Schuh. Zweitens: der Geruch von Zigarrenrauch — nicht seiner eigenen Marke."),
    ("d11","watson", WATSON, s(0.28,0.85,0.78), "Warten Sie! Langsamer. Das ist — das kann nicht sein."),
    ("d12","holmes_trim",HOLMES, s(0.55,0.90,0.38), "Ich rate Ihnen, mitzukommen, Watson. Die Dinge entwickeln sich schneller als erwartet."),
    ("d13","watson", WATSON, s(0.35,0.83,0.60), "Das ist unmöglich. Der Mann war um Mitternacht tot."),
    ("d14","holmes_trim",HOLMES, s(0.70,0.87,0.20), "War er das? Wirklich?"),
    ("d15","watson", WATSON, s(0.32,0.84,0.65), "Holmes, was wissen Sie?"),
    ("d16","holmes_trim",HOLMES, s(0.62,0.88,0.28), "Ich weiß alles. Ich habe es von Anfang an gewusst."),
    ("d17","watson", WATSON, s(0.18,0.90,0.92), "Und Sie haben nichts gesagt?!"),
    ("d18","holmes_trim",HOLMES, s(0.65,0.87,0.25), "Alles hat seinen Zeitpunkt, Watson. Alles."),
    ("d19","watson", WATSON, s(0.28,0.85,0.72), "Das ist… das ist ungeheuerlich."),
    ("d20","holmes_trim",HOLMES, s(0.72,0.88,0.18), "Nein. Das ist Logik."),
]

def log(msg):
    print(msg, flush=True)
    with LOG.open("a") as f:
        f.write(msg + "\n")

LOG.write_text("")
CLIPS.mkdir(exist_ok=True)

# ── 1. Neue Atmo ─────────────────────────────────────────────────────────────
log("=== Neue Atmo ===")
atmo_prompt = (
    "warm indoor room tone, quiet empty room, very soft analog warmth, "
    "gentle air conditioning hum, subtle tape warmth, old recording studio, "
    "no crackle, no vinyl noise, barely audible, intimate and still"
)
atmo_out = CLIPS / "atmo_loop.mp3"
payload = json.dumps({
    "text": atmo_prompt,
    "duration_seconds": 22.0,
    "prompt_influence": 0.35
}).encode()
req = urllib.request.Request(
    "https://api.elevenlabs.io/v1/sound-generation",
    data=payload,
    headers={"xi-api-key": API_KEY, "Content-Type": "application/json", "Accept": "audio/mpeg"},
    method="POST"
)
try:
    with urllib.request.urlopen(req, timeout=60) as r:
        atmo_out.write_bytes(r.read())
    log(f"  Atmo OK — {atmo_out.stat().st_size // 1024} KB")
except urllib.error.HTTPError as e:
    log(f"  Atmo FEHLER {e.code}: {e.read()[:200]}")

time.sleep(0.5)

# ── 2. Dialog-Clips mit SSML-Pausen ─────────────────────────────────────────
log("\n=== Dialog-Clips (SSML 700ms Pausen) ===")
BREAK = '<break time="700ms"/>'

errors = 0
for did, sp, voice_id, vs, text in DIALOG:
    out_path = CLIPS / f"{did}_{sp}.mp3"
    # SSML: 700ms Luft vor und nach dem Text
    ssml_text = f"<speak>{BREAK}{text}{BREAK}</speak>"
    payload = json.dumps({
        "text": ssml_text,
        "model_id": MODEL,
        "voice_settings": vs
    }).encode()
    req = urllib.request.Request(
        f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}",
        data=payload,
        headers={"xi-api-key": API_KEY, "Content-Type": "application/json",
                 "Accept": "audio/mpeg"},
        method="POST"
    )
    try:
        with urllib.request.urlopen(req, timeout=60) as r:
            out_path.write_bytes(r.read())
        dur_info = subprocess.check_output(
            ["ffprobe","-v","quiet","-show_entries","format=duration",
             "-of","csv=p=0", str(out_path)],
            text=True
        ).strip()
        log(f"  ✓ {did} ({sp:12s})  {float(dur_info):.2f}s")
    except urllib.error.HTTPError as e:
        log(f"  ✗ {did} HTTP {e.code}: {e.read()[:150]}")
        errors += 1
    except Exception as e:
        log(f"  ✗ {did}: {e}")
        errors += 1
    time.sleep(0.4)

log(f"\n{len(DIALOG) - errors}/{len(DIALOG)} OK, {errors} Fehler")

# ── 3. Mix aufrufen ──────────────────────────────────────────────────────────
log("\n=== Mix ===")
mix_script = Path(__file__).parent / "watson_dialog_mix.py"
result = subprocess.run(
    ["python3", str(mix_script)],
    capture_output=False
)
if result.returncode != 0:
    log("Mix-Script Fehler!")
else:
    log("Mix fertig.")
