"""ElevenLabs TTS — schlanker Wrapper über die HTTP-API (stdlib, kein SDK nötig).

Wird (a) für die Serbisch-Verifikation genutzt und (b) später für die echte
Sprachausgabe. Die Realtime-Conversational-AI (Agent/WebSocket) kommt separat.
"""
from __future__ import annotations

import json
import urllib.error
import urllib.request

from . import config

API = "https://api.elevenlabs.io/v1"


class ElevenError(RuntimeError):
    def __init__(self, status: int, body: str):
        self.status = status
        self.body = body
        super().__init__(f"ElevenLabs HTTP {status}: {body[:300]}")


def tts(text: str, voice_id: str | None = None, model: str | None = None,
        output_format: str = "mp3_44100_128") -> bytes:
    """Text -> MP3-Bytes. Wirft ElevenError mit Status (401=Key, 402/429=Guthaben/Quota)."""
    voice_id = voice_id or config.ELEVENLABS_VOICE_ID
    model = model or config.ELEVENLABS_MODEL
    url = f"{API}/text-to-speech/{voice_id}?output_format={output_format}"
    payload = json.dumps({"text": text, "model_id": model}).encode("utf-8")
    req = urllib.request.Request(url, data=payload, method="POST")
    req.add_header("xi-api-key", config.ELEVENLABS_API_KEY)
    req.add_header("Content-Type", "application/json")
    req.add_header("Accept", "audio/mpeg")
    try:
        with urllib.request.urlopen(req, timeout=60) as r:
            return r.read()
    except urllib.error.HTTPError as e:
        raise ElevenError(e.code, e.read().decode("utf-8", "replace")) from None
    except urllib.error.URLError as e:
        raise ElevenError(0, str(e.reason)) from None


def sound_effect(text: str, duration_seconds: float | None = None,
                 prompt_influence: float = 0.45) -> bytes:
    """ElevenLabs Sound-Effects-API: Beschreibung -> MP3-Bytes (für Tiergeräusche)."""
    url = f"{API}/sound-generation"
    payload: dict = {"text": text, "prompt_influence": prompt_influence}
    if duration_seconds:
        payload["duration_seconds"] = duration_seconds
    req = urllib.request.Request(url, data=json.dumps(payload).encode(), method="POST")
    req.add_header("xi-api-key", config.ELEVENLABS_API_KEY)
    req.add_header("Content-Type", "application/json")
    req.add_header("Accept", "audio/mpeg")
    try:
        with urllib.request.urlopen(req, timeout=90) as r:
            return r.read()
    except urllib.error.HTTPError as e:
        raise ElevenError(e.code, e.read().decode("utf-8", "replace")) from None


def list_voices() -> dict:
    req = urllib.request.Request(f"{API}/voices", method="GET")
    req.add_header("xi-api-key", config.ELEVENLABS_API_KEY)
    try:
        with urllib.request.urlopen(req, timeout=30) as r:
            return json.loads(r.read())
    except urllib.error.HTTPError as e:
        raise ElevenError(e.code, e.read().decode("utf-8", "replace")) from None
