#!/usr/bin/env python3
"""Automatischer Serbisch-Check für ElevenLabs.

Pro Testwort: ElevenLabs-TTS -> MP3 -> whisper.cpp (Serbisch) -> zurück-erkennen.
Wenn whisper das serbische Wort wiedererkennt, ist die Aussprache mindestens
verständlich-serbisch. Die MP3s bleiben in data/verify/ zum Selbst-Anhören.

Run:  cd plappi-mvp && ./.venv/bin/python scripts/verify_serbian.py
"""
import re
import subprocess
import sys
import tempfile
import unicodedata
from pathlib import Path

BASE = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(BASE))
from backend import config, eleven  # noqa: E402

OUT = config.DATA_DIR / "verify"
OUT.mkdir(parents=True, exist_ok=True)

# (Deutsch, Serbisch-Zielwort, ganzer Satz für natürlichere Aussprache)
WORDS = [
    ("Hund", "pas", "Pas."),
    ("Katze", "mačka", "Mačka."),
    ("Vogel", "ptica", "Ptica."),
    ("Hallo", "zdravo", "Zdravo."),
    ("Danke", "hvala", "Hvala."),
    ("rot", "crveno", "Crveno."),
]


def norm(s: str) -> str:
    s = unicodedata.normalize("NFKD", s.lower())
    s = "".join(c for c in s if not unicodedata.combining(c))   # č->c, ć->c
    return re.sub(r"[^a-z]", "", s)


def whisper_sr(mp3: Path) -> str:
    wav = mp3.with_suffix(".wav")
    subprocess.run([config.FFMPEG, "-nostdin", "-y", "-i", str(mp3),
                    "-ar", "16000", "-ac", "1", str(wav)], capture_output=True)
    with tempfile.TemporaryDirectory() as td:
        base = Path(td) / "o"
        subprocess.run([config.WHISPER_CLI, "-m", config.WHISPER_MODEL,
                        "-f", str(wav), "-l", "sr", "-nt", "-otxt", "-of", str(base)],
                       capture_output=True)
        txt = base.with_suffix(".txt")
        return txt.read_text(encoding="utf-8").strip() if txt.exists() else ""


def main():
    if not config.ELEVENLABS_API_KEY:
        print("FEHLER: kein ELEVENLABS_API_KEY (plappi-mvp/.env).")
        sys.exit(2)
    print(f"Voice={config.ELEVENLABS_VOICE_ID} Model={config.ELEVENLABS_MODEL}\n")
    ok = 0
    for de, sr, sentence in WORDS:
        try:
            audio = eleven.tts(sentence)
        except eleven.ElevenError as e:
            if e.status in (401,):
                print(f"AUTH-FEHLER (Key ungültig?) – {e.body[:200]}"); sys.exit(3)
            if e.status in (402, 429) or "quota" in e.body.lower() or "credit" in e.body.lower():
                print(f"KEIN GUTHABEN/QUOTA (Status {e.status}) – bitte Guthaben aufladen, dann erneut.")
                print(f"   Detail: {e.body[:200]}"); sys.exit(4)
            print(f"HTTP {e.status}: {e.body[:200]}"); sys.exit(5)
        mp3 = OUT / f"{sr}.mp3"
        mp3.write_bytes(audio)
        heard = whisper_sr(mp3)
        hit = norm(sr) in norm(heard)
        ok += hit
        print(f"  {'✅' if hit else '❌'}  {de:6} -> '{sr}'   whisper(sr) hörte: '{heard}'   [{mp3.name}]")
    print(f"\nErgebnis: {ok}/{len(WORDS)} serbische Wörter wiedererkannt.  MP3s: {OUT}")
    print("→ Bitte zusätzlich selbst anhören (Maschinen-Check ist nur Näherung).")


if __name__ == "__main__":
    main()
