#!/usr/bin/env python3
"""
TTS 组件 - 文字转语音

支持 EdgeTTS、Azure TTS 等多种后端。
"""

import asyncio
import logging
from typing import Optional, Dict, Any

from event_bus import EventBus, EventType
from components.base import BaseComponent, ComponentConfig, TTSComponent, ComponentState

logger = logging.getLogger(__name__)


class EdgeTTSTTS(TTSComponent):
    """EdgeTTS TTS 组件"""
    
    def __init__(self, config: Dict, event_bus: EventBus):
        super().__init__(
            config=ComponentConfig(
                name="tts_edge",
                enabled=config.get("tts", {}).get("enabled", True),
                priority=3,
                dependencies=[]
            ),
            event_bus=event_bus
        )
        
        self.tts_config = config.get("tts", {})
        self.voice = self.tts_config.get("voice", "zh-CN-XiaoxiaoNeural")
        
        self._is_ready = False
    
    async def _do_initialize(self):
        """初始化 EdgeTTS"""
        logger.info(f"🔊 初始化 TTS: {self.voice}")
        
        try:
            # TODO: 实际部署时初始化 EdgeTTS
            # import edge_tts
            # self._communicate = edge_tts.Communicate(text, self.voice)
            
            self._is_ready = True
            logger.info("✅ TTS 初始化完成")
        except Exception as e:
            logger.error(f"❌ TTS 初始化失败: {e}")
            self._is_ready = False
    
    async def _run_loop(self):
        """TTS 主循环"""
        logger.info("🔄 TTS 主循环启动")
        
        while self.state == ComponentState.RUNNING:
            try:
                await asyncio.sleep(60)
            except asyncio.CancelledError:
                break
            except Exception as e:
                logger.error(f"❌ TTS 主循环错误: {e}")
                await asyncio.sleep(10)
    
    async def speak(self, text: str) -> bytes:
        """
        合成语音

        Args:
            text: 文本

        Returns:
            bytes: 音频数据
        """
        if not self._is_ready or not text:
            return b""

        try:
            import edge_tts

            # Edge TTS 需要 asyncio 事件循环
            communicate = edge_tts.Communicate(text, self.voice)
            audio_data = b""
            async for chunk in communicate.stream():
                if chunk.get("type") == "audio":
                    audio_data += chunk["data"]

            logger.info(f"🔊 TTS 合成完成: {len(audio_data)} bytes")
            return audio_data

        except ImportError:
            logger.error("❌ edge_tts 未安装")
            self.event_bus.publish(EventType.SYSTEM_ERROR, {
                "component": "tts",
                "error": "edge_tts not installed"
            }, source="tts_edge")
            return b""
        except Exception as e:
            logger.error(f"❌ TTS 合成失败: {e}")
            self.event_bus.publish(EventType.SYSTEM_ERROR, {
                "component": "tts",
                "error": str(e)
            }, source="tts_edge")
            return b""
    
    def is_ready(self) -> bool:
        """检查 TTS 是否就绪"""
        return self._is_ready

    def health_check(self) -> Dict[str, Any]:
        """健康检查"""
        return {
            "status": "healthy" if self._is_ready else "unhealthy",
            "voice": self.voice,
            "backend": "edge_tts"
        }


class AzureTTSTTS(TTSComponent):
    """Azure TTS 组件（备选实现）"""
    
    def __init__(self, config: Dict, event_bus: EventBus):
        super().__init__(
            config=ComponentConfig(
                name="tts_azure",
                enabled=False,
                priority=3,
                dependencies=[]
            ),
            event_bus=event_bus
        )
        self.voice = config.get("tts", {}).get("azure_voice", "zh-CN-XiaoxiaoNeural")
    
    async def _do_initialize(self):
        pass
    
    async def _run_loop(self):
        pass
    
    async def speak(self, text: str) -> bytes:
        return b""


# ========== 工厂函数 ==========

def create_tts_component(config: Dict, event_bus: EventBus) -> TTSComponent:
    """
    创建 TTS 组件
    
    Args:
        config: 配置字典
        event_bus: 事件总线
    
    Returns:
        TTSComponent: TTS 组件实例
    """
    backend = config.get("tts", {}).get("backend", "edge_tts")
    
    if backend == "edge_tts":
        return EdgeTTSTTS(config, event_bus)
    elif backend == "azure":
        return AzureTTSTTS(config, event_bus)
    else:
        logger.warning(f"⚠️ 未知 TTS 后端: {backend}，使用 EdgeTTS")
        return EdgeTTSTTS(config, event_bus)
