import os
import sys
import re
import traceback
import requests
from io import BytesIO
from dotenv import load_dotenv

load_dotenv()

try:
    sys.stdout.reconfigure(encoding="utf-8")
except Exception:
    pass


def normalize_sentence(sentence: str) -> str:
    sentence = re.sub(r"(\d+)[\.,]\d+", lambda m: m.group(1), sentence)
    sentence = re.sub(r"\s+", " ", sentence).strip()
    return sentence


def create_voice(text: str) -> BytesIO:
    api_key = os.getenv("ELEVENLABS_API_KEY")
    if not api_key:
        raise RuntimeError("ELEVENLABS_API_KEY tanımlı değil.")

    voice_id = os.getenv("VOICE_KUPA1") or "6dcFFb31LVaCdYevmTAx"
    url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"

    payload = {
        "text": text,
        "model_id": "eleven_v3",
        "languages": [{"language_id": "tr", "name": "Turkish"}],
        "voice_settings": {
            "stability": 0.5,
            "speed": 0.85
        },
        "pronunciation_guide": {
            "style": "heyecanlı spor spikeri",
            "hints": (
                "Enerjik ve akıcı oku. 'Önümüzdeki maç' ve takım isimlerini net vurgula. "
                "Tarih ve saatte kısa durak yap. 'sonra başlayacak' kısmını güçlü bitir."
            )
        }
    }

    resp = requests.post(
        url,
        headers={"xi-api-key": api_key, "Content-Type": "application/json"},
        json=payload,
        timeout=60
    )

    if resp.status_code >= 400:
        raise RuntimeError(f"ElevenLabs HTTP {resp.status_code}: {resp.text[:500]}")

    return BytesIO(resp.content)


def main():
    log_file = os.path.join(os.path.dirname(__file__), "kupa1_py.log")
    try:
        if len(sys.argv) < 3:
            raise ValueError("Kullanım: python kupa1.py <sentence> <output_path>")

        sentence = normalize_sentence(sys.argv[1])
        output_path = sys.argv[2]

        audio_stream = create_voice(sentence)

        os.makedirs(os.path.dirname(output_path), exist_ok=True)
        with open(output_path, "wb") as f:
            f.write(audio_stream.read())

        print(f"OK: wrote mp3 -> {output_path}")
        sys.exit(0)

    except Exception as e:
        err = f"ERROR: {e}\n{traceback.format_exc()}"
        try:
            with open(log_file, "a", encoding="utf-8") as f:
                f.write("\n" + ("-" * 60) + "\n")
                f.write(err + "\n")
        except Exception:
            pass
        print(err)
        sys.exit(1)


if __name__ == "__main__":
    main()