import os
import sys

missing = []
for lib in ["google-genai"]:
    try:
        __import__("google.genai")
    except ImportError:
        missing.append(lib)

if missing:
    print(f"Error: Missing libraries:\n{', '.join(missing)}")
    print("  install: pip install google-genai")
    input("\nPress ENTER to terminate>>\n")
    sys.exit(1)

from google import genai
from google.genai import types
from tktts_base import apply_replacements, normalize_speaker, split_dialogue

TTS_ENGINE_NAME = 'gemini'
# ご指摘のTTS専用モデルを正しく指定
DEFAULT_TTS_MODEL = "gemini-3.8-flash-tts" # gemini-3.8-flash-lite-tts
voices_available = ["Kore", "Puck", "Aoede", "Charon", "Fenrir"] 
DEFAULT_GEMINI_VOICE = "Kore"

client = genai.Client()

def get_available_voices_info():
    voices = []
    for v in voices_available:
        voices.append({"name": v})
    return voices

def get_available_voices():
    return voices_available

def list_available_voices():
    print(f"=== 利用可能な {TTS_ENGINE_NAME} voices ===")
    voices = get_available_voices_info()
    if not voices: return False
    
    for v in voices:
        print(f"  Name: {v['name']}")
    return True

def speak(outfile, text, voice, tts_model=DEFAULT_TTS_MODEL, instruction="", output_format="wav"):
    try:
        # TTS専用モデルの場合、会話用のプロンプト（「読み上げてください」等）を付けると
        # その指示部分まで音声合成されてしまうため、テキストを直接渡します。
        prompt_text = text
        if instruction:
            prompt_text = f"[{instruction}] {text}"
            
        response = client.models.generate_content(
            model=tts_model,
            contents=prompt_text,
            config=types.GenerateContentConfig(
                response_modalities=["AUDIO"],
                speech_config=types.SpeechConfig(
                    voice_config=types.VoiceConfig(
                        prebuilt_voice_config=types.PrebuiltVoiceConfig(
                            voice_name=voice
                        )
                    )
                )
            )
        )
        
        audio_data = None
        text_responses = []

        # レスポンスから音声データを探索
        if response.candidates and response.candidates[0].content.parts:
            for part in response.candidates[0].content.parts:
                if part.inline_data:
                    audio_data = part.inline_data.data
                    break
                elif part.text:
                    text_responses.append(part.text)
        
        if not audio_data:
            returned_text = " ".join(text_responses)
            print(f"❌ Geminiが音声データを生成しませんでした。")
            print(f"  返されたテキスト: {returned_text}")
            return None

        # 音声データを保存
        with open(outfile, "wb") as f:
            f.write(audio_data)
            
        if os.path.exists(outfile):
            print(f" ファイル [{outfile}] を保存しました")
        else:
            print(f" Error: ファイル [{outfile}] の出力に失敗しました")
            return None
            
    except Exception as e:
        print(f"❌ Gemini API 接続エラー: {e}")
        return None

    return outfile
    
def speak_dialogue(dialogue, replacements, target_voices, speakers={}, instruction="", 
                temp_dir=None, outfile=None, ext="wav", tts_model=DEFAULT_TTS_MODEL, cfg=None):
    is_save_mode = bool(outfile)

    print("\ntktts_gemini.speak_dialogue(): ")
    tmpfiles = []
    idx = 1
    
    for i, _dialogue in enumerate(dialogue):
        print(f"\nDialogue {i:04d}:")
        dialogue_list = split_dialogue(
            _dialogue, target_voices, speakers=speakers, 
            default_voice=DEFAULT_GEMINI_VOICE, is_monologue=cfg.monologue if cfg else False
        )
        
        for speaker, text in dialogue_list:
            if temp_dir:
                tmpfile = os.path.join(temp_dir, f"tmp_{idx:03d}.{ext}")
            else:
                tmpfile = f"tmp_{idx:03d}.{ext}"
                
            text = apply_replacements(text, replacements)
            
            if isinstance(target_voices, str): 
                target_voice = target_voices
            else:
                target_voice = target_voices.get(speaker, DEFAULT_GEMINI_VOICE)
                
            print(f"  {idx:04d}: voice={speaker} (id={target_voice}): {text}")

            _outfile = speak(tmpfile, text, target_voice, tts_model=tts_model, instruction=instruction, output_format=ext)
            if _outfile is None: 
                return False, tmpfiles

            tmpfiles.append(tmpfile)
            idx += 1

    return True, tmpfiles