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


# Model adının seslendirilişi. Marka kılavuzu İngilizce okunuşu istiyorsa
# "Rav For" yapın; olduğu gibi bırakmak için None atayın.
RAV4_OKUNUSU = "Rav Dört"


def normalize_sentence(sentence: str) -> str:
    # 3.4 -> 3  (mesafe PHP tarafında zaten yazıya çevriliyor, bu bir emniyet)
    sentence = re.sub(r"(\d+)[\.,]\d+", lambda m: m.group(1), sentence)
    # Fazla boşlukları toparla
    sentence = re.sub(r"\s+", " ", sentence).strip()
    # RAV4 -> okunuş; ekler korunur ("RAV4'ü" -> "Rav Dört'ü")
    if RAV4_OKUNUSU:
        sentence = re.sub(r"\bRAV4\b", RAV4_OKUNUSU, sentence)
    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_TOYOTA") or os.getenv("VOICE_ID")
    if not voice_id:
        raise RuntimeError("VOICE_TOYOTA / VOICE_ID tanımlı değil.")

    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.6,
            "similarity_boost": 0.75,
            "style": 0.4,
            "speaker_boost": True,
            "speed": 0.95,
        },
        "pronunciation_guide": {
            "style": "sakin, güven veren ve kendinden emin otomotiv reklamı seslendirmesi",
            "hints": (
                "Trafik cümlesini haber verir gibi doğal ve akıcı oku, dramatize etme. "
                "'Rav Dört' model adını net söyle, 'Rav' ve 'Dört' arasında kısa bir bağ bırak. "
                "'Rav Dört Hybrid' ifadesinde hibrit vaadini hafif vurgula. "
                "Bayi adını ve mesafeyi net, anlaşılır söyle; adres okur gibi değil, davet eder gibi. "
                "'Koşullar değişir, RAV4 uyumlanır' cümlesinde virgülde kısa dur, ikinci yarıyı kararlı bitir. "
                "Son 'Toyota RAV4' imzasını sakin ve net söyle."
            ),
        },
    }

    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(os.path.abspath(__file__)), "toyota_py.log")
    try:
        if len(sys.argv) < 3:
            raise ValueError("Kullanım: python toyota2.py <sentence> <output_path>")

        sentence = normalize_sentence(sys.argv[1])
        output_path = sys.argv[2]

        print(f"Metin: {sentence}")
        print(f"Çıkış: {output_path}")

        audio_stream = create_voice(sentence)

        out_dir = os.path.dirname(output_path)
        if out_dir:
            os.makedirs(out_dir, exist_ok=True)

        with open(output_path, "wb") as f:
            f.write(audio_stream.read())

        print(f"OK: Toyota RAV4 trafik spotu yazıldı -> {output_path}")
        sys.exit(0)

    except Exception as e:
        err = f"ERROR (toyota2): {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()
