import os

missing = []
for lib in ["openai"]:
    try:
        __import__(lib)
    except ImportError:
        missing.append(lib)

if missing:
    print(f"Error: Missing libraries:\n{', '.join(missing)}")
    print("  install: pip install openai")
    input("\nPress ENTER to terminate>>\n")
    sys.exit(1)

import openai

from tktts_base import apply_replacements, normalize_speaker, split_dialogue


TTS_ENGINE_NAME = 'openai'
tts_model = "tts-1" # "tts-1-hd", "gpt-4o-mini-tts"
DEFAULT_TTS_MODEL = "tts-1" # "tts-1-hd", "gpt-4o-mini-tts"
voices_available = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"] #"verse", "sage"]:
DEFAULT_OPENAI_VOICE = "alloy"


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 = "mp3"):
    try:
        response = openai.audio.speech.create(
            model = tts_model, 
            voice = voice, 
            input = text,
            instructions = instruction,
            response_format = output_format
            )
        with open(outfile, "wb") as f:
            f.write(response.read())
            if os.path.exists(outfile):
                print(f"　ファイル [{outfile}] を保存しました")
            else:
                print(f"　Error: ファイル [{outfile}] の出力に失敗しました")
                return False, tmpfiles
    except openai.APIStatusError as e:
        print(f"❌ OpenAI API エラー (ステータス {e.status_code}): {e.response.text}")
        return None
    except Exception as e:
        print(f"❌ OpenAI 接続エラー: {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()
    print("tktts_openai.speak_dialogue(): ")
    tmpfiles = []
    idx = 1
    for i, _dialogue in enumerate(dialogue):
        print()
        print(f"Dialogue {i:04d}:")
        dialogue_list = split_dialogue(_dialogue, target_voices, speakers = speakers, 
                            default_voice = DEFAULT_OPENAI_VOICE, is_monologue = cfg.monologue)
        for speaker, text in dialogue_list:
            tmpfile = os.path.join(temp_dir, f"tmp_{idx:03d}.{ext}")
            text = apply_replacements(text, replacements)
            if type(target_voices) is str: 
                target_voice = target_voices
            else:
                target_voice = target_voices[speaker]
            print(f"  {idx:04d}: voice={speaker} (id={target_voice}): ", end = "")
            print(text)

#            tmpfile = os.path.join(temp_dir, f"tmp_{i:03d}.{ext}")
            _outfile = speak(tmpfile, text, target_voice)
            if _outfile is None: return False, tmpfiles

        tmpfiles.append(tmpfile)
        idx += 1

    return True, tmpfiles

    