import os
import re
import time
import subprocess

from tktts_base import apply_replacements, normalize_speaker, split_dialogue


TTS_ENGINE_NAME = 'aquestalkplayer'


tts_model = "tts-1" # "tts-1-hd", "gpt-4o-mini-tts"
voices_available = ["れいむ", "まりさ", "こいし", "さとり", "男声１", "男声２", "女性１", "女性２", 
        "ロボット", "ロボット2", "機械"]
DEFAULT_ATP_VOICE = "れいむ"


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, aquestalk_path = "aquestalkplayer.exe"):
    if not os.path.isfile(aquestalk_path):
        print(f"❌ AquesTalkPlayer.exe が見つかりません。パスを確認してください: {aquestalk_path}")
        return None

    cmd = [
        aquestalk_path,
        "/wait",
        "/T", f'"{text}"',
        "/P", voice,
        "/W", f'"{outfile}"'
        ]
    
    try:
        # shell=True はセキュリティ上のリスクがあるが、既存プログラムの慣習に合わせて使用
        result = subprocess.run(" ".join(cmd), shell=True, capture_output=True, text=True, encoding="shift_jis")
        
        if result.returncode == 0:
            print(f"  ファイル [{outfile}] を保存しました")
        else:
            print(f"  Error: ファイル [{outfile}] の出力に失敗しました")
            print(f"  ❌ AquesTalkPlayer 実行エラー? (Preset: {voice}, Text: {text[:20]}...)")
            return None
    except Exception as e:
        print(f"❌ AquesTalkPlayer 実行中に予期せぬエラー: {e}")
        return None

    return outfile

def speak_dialogue(dialogue, replacements, target_voices, speakers = {}, aquestalk_path = None, 
            temp_dir = None, outfile = None, ext = "wav", cfg = None):
    is_save_mode = bool(outfile)

    print()
    print("tktts_aquestalkplayer.speak_dialogue(): ")

    tmpfiles = []
    ext = "wav"
    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_ATP_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_{idx:03d}.{ext}")

            _outfile = speak(tmpfile, text, voice = target_voice, aquestalk_path = aquestalk_path)
            if _outfile is None:
                return False, tmpfiles

            tmpfiles.append(tmpfile)
            idx += 1

    return True, tmpfiles

    