"""Stimmen-Auswahl: mehrere Kandidaten + Hörproben, aktive Stimme setzen.

Der Nutzer hört Proben und wählt -> setzt die Stimme im ElevenLabs-Agenten.
"""
from __future__ import annotations

import json
import urllib.error
import urllib.request

from . import config, eleven

# Qualitätsmodell mit der BESTEN Serbisch-Aussprache (turbo/flash sprechen Serbisch
# schlecht). Etwas mehr Latenz, aber für einen Sprach-Tutor ist korrekte Aussprache Pflicht.
AGENT_TTS_MODEL = "eleven_multilingual_v2"

# Serbisch-lastige Probe (testet ć, č, š, ž) + 1 deutscher Satz → beide Sprachen hörbar.
SAMPLE_TEXT = ("Ćao! Ja sam Plappi. Hajde da učimo srpski! Vidiš? Pas, mačka, ptica, žaba. "
               "Ponovi za mnom: mačka! Und auf Deutsch sagen wir Katze.")

# Native serbische/kroatische Stimmen (sprechen Serbisch RICHTIG aus) zuerst,
# Sandra (deutsch) als Vergleich. Nemanja (Muttersprachler) wählt per Ohr.
CANDIDATES = [
    {"id": "JDYfAX20MbYfJGIjPTZz", "label": "Ivana — ruhig, langsam, freundlich", "note": "🇷🇸 nativ, ideal für Kinder ⭐"},
    {"id": "FXlzTee7Zx2caYKIAwBF", "label": "Nina — ruhig, warm, voll", "note": "🇷🇸 nativ, weich"},
    {"id": "d3l4f3HgkE3P6Fo91lYA", "label": "Ida — klar & selbstbewusst", "note": "🇷🇸 nativ serbisch"},
    {"id": "eWKPI657Btpf4xbqX4x6", "label": "Ana — jung & freundlich", "note": "🇷🇸 nativ serbisch"},
    {"id": "jVBTQrP67HZEE22UqQGF", "label": "Mihael — männlich, Radio-Stimme", "note": "🇭🇷 nativ, männl. Option"},
    {"id": "0x1SL53CGQ0glOQTYzVa", "label": "Sandra — deutsch, warm", "note": "🇩🇪 zum Vergleich (deutscher Akzent)"},
]
DEFAULT_VOICE = "JDYfAX20MbYfJGIjPTZz"  # Ivana (nativ, kinderfreundlich)


def _agent_get() -> dict:
    req = urllib.request.Request(f"https://api.elevenlabs.io/v1/convai/agents/{config.ELEVENLABS_AGENT_ID}")
    req.add_header("xi-api-key", config.ELEVENLABS_API_KEY)
    return json.loads(urllib.request.urlopen(req, timeout=30).read())


def active_voice_id() -> str:
    try:
        d = _agent_get()
        return d.get("conversation_config", {}).get("tts", {}).get("voice_id", "")
    except Exception:
        return ""


def ensure_sample(voice_id: str) -> str:
    """Erzeugt (einmalig) eine Hörprobe -> data/audio/voices/<id>.mp3, gibt rel. Pfad."""
    out_dir = config.AUDIO_DIR / "voices"
    out_dir.mkdir(parents=True, exist_ok=True)
    out = out_dir / f"{voice_id}.mp3"
    if not (out.exists() and out.stat().st_size > 500):
        audio = eleven.tts(SAMPLE_TEXT, voice_id=voice_id, model=AGENT_TTS_MODEL)
        out.write_bytes(audio)
    return f"/audio/voices/{voice_id}.mp3"


def list_voices() -> dict:
    active = active_voice_id()
    out = []
    for c in CANDIDATES:
        try:
            sample = ensure_sample(c["id"])
        except Exception:
            sample = ""
        out.append({**c, "sample": sample, "active": c["id"] == active})
    return {"voices": out, "active": active}


def set_active(voice_id: str) -> dict:
    body = {"conversation_config": {"tts": {"voice_id": voice_id, "model_id": AGENT_TTS_MODEL}}}
    req = urllib.request.Request(
        f"https://api.elevenlabs.io/v1/convai/agents/{config.ELEVENLABS_AGENT_ID}",
        data=json.dumps(body).encode(), method="PATCH")
    req.add_header("xi-api-key", config.ELEVENLABS_API_KEY)
    req.add_header("Content-Type", "application/json")
    try:
        with urllib.request.urlopen(req, timeout=30) as r:
            return {"ok": r.status == 200, "voice_id": voice_id}
    except urllib.error.HTTPError as e:
        return {"ok": False, "error": f"HTTP {e.code}: {e.read().decode()[:200]}"}
