"""Server-side VowelMarks example. Python 3.10+, no external packages."""
import json
import os
import sys
from pathlib import Path
from urllib.error import HTTPError
from urllib.request import Request, urlopen


def make_speech(text, request_id, premium=False):
    api_key = os.environ["VOWELMARKS_API_KEY"]
    base = os.environ.get("VOWELMARKS_API_BASE_URL", "https://api.vowelmarks.com")
    payload = {"text": text, "tier": "basic", "voice": "kian", "pace": 1}
    if premium:
        payload = {
            "text": text, "tier": "premium", "voice": "Kore", "pace": 1,
            "style": "instructional", "expressiveness": "calm",
            "director_notes": "Read clearly for an adult Persian lesson. Keep pauses short."
        }
    body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
    request = Request(
        base.rstrip("/") + "/v1/speech", data=body, method="POST",
        headers={
            "Authorization": "Bearer " + api_key,
            "Content-Type": "application/json",
            "Idempotency-Key": request_id,
        },
    )
    try:
        with urlopen(request, timeout=900) as response:
            result = json.load(response)
    except HTTPError as error:
        detail = json.loads(error.read()).get("error", {})
        raise RuntimeError(
            f"HTTP {error.code}: {detail.get('code', 'api_error')}; "
            f"retryable={detail.get('retryable', False)}; "
            f"Retry-After={error.headers.get('Retry-After', 'not supplied')}"
        ) from None

    extensions = {"audio/wav": ".wav", "audio/mpeg": ".mp3"}
    extension = extensions.get(result["mime_type"])
    if extension is None:
        raise RuntimeError("Unexpected audio MIME type")
    # The signed URL authorizes this GET. Do not attach the API key.
    with urlopen(result["audio_url"], timeout=120) as response:
        audio = response.read()
    if not audio:
        raise RuntimeError("The audio download was empty")
    destination = Path("persian-lesson" + extension)
    destination.write_bytes(audio)
    print(f"Saved {destination}: {result['duration_seconds']:.2f} seconds")
    return result


if __name__ == "__main__":
    if len(sys.argv) not in (2, 3) or (len(sys.argv) == 3 and sys.argv[2] != "--premium"):
        raise SystemExit("Usage: python3 persian-tts.py script.txt [--premium]")
    # newline="" preserves the input file's line endings.
    with open(sys.argv[1], encoding="utf-8", newline="") as source:
        text = source.read()
    make_speech(text, os.environ["VOWELMARKS_REQUEST_ID"], premium=len(sys.argv) == 3)
