"""
QQ机器人主程序
基于官方SDK: https://github.com/tencent-connect/botpy
官方文档: https://bot.q.qq.com/wiki/develop/api-v2/
"""
import botpy
from botpy.message import Message
from src.core.config import Config
from src.utils.logger import setup_logger
from src.handlers.message_handler_ai import MessageHandler

logger = setup_logger('QQBot')


def build_intents() -> botpy.Intents:
    """
    构建最小可用的 intents。

    - public_guild_messages: 频道公域 @机器人 消息
    - public_messages: 群聊@ + C2C 私聊（好友单聊）消息
    """
    intents = botpy.Intents.none()
    intents.public_guild_messages = True

    # 新版 botpy 中，QQ 群聊@ / C2C 私聊依赖 public_messages（GROUP_AND_C2C_EVENT）。
    if hasattr(intents, "public_messages"):
        intents.public_messages = True
        logger.info("✅ 已启用 public_messages（支持群聊@与 C2C 私聊）")
    else:
        logger.warning("⚠️ 当前 botpy 不支持 public_messages，可能无法接收 C2C 私聊事件")

    return intents


class MyClient(botpy.Client):
    """QQ机器人客户端"""
    
    def __init__(self, intents: botpy.Intents):
        super().__init__(intents=intents)
        self.message_handler = MessageHandler(self)
    
    async def on_ready(self):
        """机器人启动完成事件"""
        logger.info(f"🤖 机器人已启动: {self.robot.name} (ID: {self.robot.id})")
    
    async def on_at_message_create(self, message: Message):
        """处理@机器人的消息（频道公域消息）"""
        await self.message_handler.handle_at_message(message)
    
    async def on_message_create(self, message: Message):
        """处理普通消息（需要私域权限）"""
        await self.message_handler.handle_at_message(message)
    
    async def on_direct_message_create(self, message: Message):
        """处理私信消息"""
        await self.message_handler.handle_at_message(message)
    
    async def on_group_at_message_create(self, message: Message):
        """处理群聊@消息"""
        await self.message_handler.handle_at_message(message)
    
    async def on_c2c_message_create(self, message: Message):
        """处理C2C消息（单聊）"""
        await self.message_handler.handle_at_message(message)
    
    async def on_guild_create(self, guild):
        """机器人加入频道事件"""
        logger.info(f"➕ 加入频道: {guild.name} (ID: {guild.id})")
    
    async def on_guild_delete(self, guild):
        """机器人离开频道事件"""
        logger.info(f"➖ 离开频道: {guild.name} (ID: {guild.id})")
    
    async def on_error(self, error):
        """错误处理"""
        logger.error(f"❌ 发生错误: {error}")


def main():
    """主函数"""
    try:
        # 验证配置
        Config.validate()
        logger.info("✅ 配置验证通过")
        
        # 创建机器人实例 - 使用最小可用 intents，避免 disallowed intents(4014)
        intents = build_intents()
        logger.info("✅ Intents 配置完成（最小权限模式）")
        
        client = MyClient(intents=intents)
        
        # 启动机器人
        logger.info("🚀 正在启动机器人...")
        client.run(appid=Config.BOT_APPID, secret=Config.BOT_SECRET)
        
    except ValueError as e:
        logger.error(f"❌ 配置错误: {e}")
        logger.error("请检查 .env 文件配置")
    except Exception as e:
        logger.error(f"❌ 启动失败: {e}")
        raise


if __name__ == "__main__":
    main()
