import os
import re
import sys
import traceback
from io import BytesIO

import requests
from dotenv import load_dotenv


SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
load_dotenv(os.path.join(SCRIPT_DIR, ".env"))

try:
    sys.stdout.reconfigure(encoding="utf-8")
except Exception:
    pass


def normalize_sentence(sentence: str) -> str:
    sentence = re.sub(r"\bPM\s*2[\.,]5\b", "PM iki buçuk", sentence, flags=re.IGNORECASE)
    sentence = re.sub(r"\b1[\.,]3\s*/\s*1[\.,]6\b", "bir üç, bir altı", sentence)
    sentence = re.sub(r"\s+", " ", sentence).strip()
    return sentence


def create_voice(text: str) -> BytesIO:
    api_key = os.getenv("ELEVENLABS_API_KEY")
    voice_id = os.getenv("VOICE_IMUNEKS") or os.getenv("VOICE_ID3") or os.getenv("VOICE_ID")

    if not api_key:
        raise RuntimeError("ELEVENLABS_API_KEY tanımlı değil.")
    if not voice_id:
        raise RuntimeError("VOICE_IMUNEKS, VOICE_ID3 veya VOICE_ID tanımlı değil.")

    response = requests.post(
        f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}",
        headers={
            "xi-api-key": api_key,
            "Content-Type": "application/json",
        },
        json={
            "text": text,
            "model_id": "eleven_v3",
            "languages": [{"language_id": "tr", "name": "Turkish"}],
            "voice_settings": {
                "stability": 0.72,
                "similarity_boost": 0.78,
                "style": 0.30,
                "speaker_boost": True,
                "speed": 0.96,
            },
            "pronunciation_guide": {
                "style": "sıcak, güven veren ve bilgilendirici radyo spikeri",
                "hints": (
                    "Hava kalitesi bilgisini sakin ve tarafsız aktar. "
                    "İmuneks, Beta Glukan, PM iki buçuk ve mikrogram ifadelerini net telaffuz et. "
                    "Takviye uyarılarını hızlandırmadan anlaşılır oku. "
                    "Metne yeni sağlık vaadi veya açıklama ekleme."
                ),
            },
        },
        timeout=60,
    )

    if response.status_code >= 400:
        raise RuntimeError(f"ElevenLabs HTTP {response.status_code}: {response.text[:500]}")

    return BytesIO(response.content)


def main() -> None:
    log_file = os.path.join(SCRIPT_DIR, "imuneks_py.log")

    try:
        if len(sys.argv) < 3:
            raise ValueError("Kullanım: python imuneks.py <sentence> <output_path>")

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

        print(f"İmuneks metni: {sentence}")
        print(f"Çıkış: {output_path}")

        audio_stream = create_voice(sentence)
        output_dir = os.path.dirname(os.path.abspath(output_path))
        os.makedirs(output_dir, exist_ok=True)

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

        print(f"OK: İmuneks hava kalitesi sesi yazıldı -> {output_path}")

    except Exception as error:
        error_text = f"ERROR (imuneks): {error}\n{traceback.format_exc()}"
        try:
            with open(log_file, "a", encoding="utf-8") as log:
                log.write("\n" + ("-" * 60) + "\n")
                log.write(error_text + "\n")
        except Exception:
            pass

        print(error_text)
        raise SystemExit(1)


if __name__ == "__main__":
    main()

