"""
语音回复工具 - 将文字转换为语音输出
"""
import base64
from typing import Optional
from langchain.tools import tool
from coze_coding_dev_sdk import TTSClient
from coze_coding_utils.runtime_ctx.context import new_context
import logging
import requests

logger = logging.getLogger(__name__)


@tool
def speak_to_user(
    text: str,
    speaker: str = "zh_female_xiaohe_uranus_bigtts",
    audio_format: str = "mp3",
    speech_rate: int = 0,
    loudness_rate: int = 0
) -> str:
    """
    将文字转换为语音，用于语音回复用户。
    
    参数:
        text: 要转换为语音的文字内容
        speaker: 语音角色，默认为"zh_female_xiaohe_uranus_bigtts"（温柔女声）
                可选：
                - zh_male_m191_uranus_bigtts（男声-云舟）
                - zh_female_vv_uranus_bigtts（女声-Vivi，中英双语）
                - zh_female_xueayi_saturn_bigtts（儿童故事）
        audio_format: 音频格式，默认mp3，可选：mp3/pcm/ogg_opus
        speech_rate: 语速调整，范围-50到100，默认0（正常语速）
        loudness_rate: 音量调整，范围-50到100，默认0（正常音量）
    
    返回:
        语音文件的URL地址
    """
    try:
        # 获取上下文
        ctx = new_context(method="tts.synthesize")
        
        # 初始化TTS客户端
        client = TTSClient(ctx=ctx)
        
        logger.info(f"正在生成语音: {text[:50]}...")
        
        # 调用TTS服务
        audio_url, audio_size = client.synthesize(
            uid="property_assistant_user",
            text=text,
            speaker=speaker,
            audio_format=audio_format,
            sample_rate=24000,
            speech_rate=speech_rate,
            loudness_rate=loudness_rate
        )
        
        logger.info(f"语音生成成功: {audio_url}, 大小: {audio_size} bytes")
        
        return audio_url
            
    except Exception as e:
        error_msg = f"语音生成失败: {str(e)}"
        logger.error(error_msg, exc_info=True)
        return f"错误：{error_msg}"


@tool
def get_available_voices() -> str:
    """
    获取可用的语音角色列表。
    
    返回:
        可用语音角色及其描述的JSON字符串
    """
    import json
    
    voices = {
        "通用场景": [
            {
                "id": "zh_female_xiaohe_uranus_bigtts",
                "name": "小何",
                "description": "温柔女声，适合日常对话",
                "gender": "女"
            },
            {
                "id": "zh_female_vv_uranus_bigtts",
                "name": "Vivi",
                "description": "中英双语女声，适合国际社区",
                "gender": "女"
            },
            {
                "id": "zh_male_m191_uranus_bigtts",
                "name": "云舟",
                "description": "稳重男声，适合正式场合",
                "gender": "男"
            },
            {
                "id": "zh_male_taocheng_uranus_bigtts",
                "name": "小天",
                "description": "亲切男声，适合日常服务",
                "gender": "男"
            }
        ],
        "专业场景": [
            {
                "id": "zh_male_dayi_saturn_bigtts",
                "name": "大一",
                "description": "专业男声，适合通知公告",
                "gender": "男"
            },
            {
                "id": "zh_female_jitangnv_saturn_bigtts",
                "name": "鸡汤女",
                "description": "激励女声，适合温馨提示",
                "gender": "女"
            }
        ]
    }
    
    return json.dumps(voices, ensure_ascii=False)
