"""
WebSocket连接管理器
"""
from typing import Dict, Set
from fastapi import WebSocket
import json
import asyncio


class WebSocketManager:
    """WebSocket连接管理器"""
    
    def __init__(self):
        """初始化管理器"""
        # execution_id -> Set[WebSocket]
        self.active_connections: Dict[str, Set[WebSocket]] = {}
    
    async def connect(self, websocket: WebSocket, execution_id: str):
        """
        建立WebSocket连接
        
        Args:
            websocket: WebSocket连接
            execution_id: 执行记录ID
        """
        await websocket.accept()
        
        if execution_id not in self.active_connections:
            self.active_connections[execution_id] = set()
        
        self.active_connections[execution_id].add(websocket)
    
    def disconnect(self, websocket: WebSocket, execution_id: str):
        """
        断开WebSocket连接
        
        Args:
            websocket: WebSocket连接
            execution_id: 执行记录ID
        """
        if execution_id in self.active_connections:
            self.active_connections[execution_id].discard(websocket)
            
            # 如果没有连接了，删除该execution_id
            if not self.active_connections[execution_id]:
                del self.active_connections[execution_id]
    
    async def send_personal_message(self, message: dict, websocket: WebSocket):
        """
        发送个人消息
        
        Args:
            message: 消息内容
            websocket: WebSocket连接
        """
        try:
            await websocket.send_json(message)
        except Exception as e:
            print(f"发送WebSocket消息失败: {e}")
    
    async def broadcast_to_execution(self, execution_id: str, message: dict):
        """
        向特定执行的所有连接广播消息
        
        Args:
            execution_id: 执行记录ID
            message: 消息内容
        """
        if execution_id not in self.active_connections:
            return
        
        # 需要断开连接的连接
        disconnected = set()
        
        for websocket in self.active_connections[execution_id]:
            try:
                await websocket.send_json(message)
            except Exception as e:
                print(f"广播消息失败: {e}")
                disconnected.add(websocket)
        
        # 移除断开的连接
        for websocket in disconnected:
            self.disconnect(websocket, execution_id)


# 全局WebSocket管理器实例
websocket_manager = WebSocketManager()
