"""MCPクライアント管理モジュール"""
import os
from dotenv import load_dotenv
from agents.mcp.server import MCPServerStdio

load_dotenv()


class MCPClient:
    """MCPサーバーへの接続を管理するクラス"""

    def __init__(self):
        self.playwright_server = None
        self.slack_server = None

    async def __aenter__(self):
        """非同期コンテキストマネージャーのエントリー"""
        # Playwright MCPサーバーの初期化
        self.playwright_server = MCPServerStdio(
            params={
                "command": "npx",
                "args": ["-y", "@playwright/mcp@latest", "--image-responses=omit"]
            },
            client_session_timeout_seconds=20,  # ブラウザ操作用に60秒に延長
        )
        await self.playwright_server.__aenter__()

        # Slack MCPサーバーの初期化
        self.slack_server = MCPServerStdio(
            params={
                "command": "npx",
                "args": ["-y", "@modelcontextprotocol/server-slack"],
                "env": {
                    "SLACK_BOT_TOKEN": os.getenv("SLACK_BOT_TOKEN"),
                    "SLACK_TEAM_ID": os.getenv("SLACK_TEAM_ID"),
                    "SLACK_CHANNEL_IDS": os.getenv("SLACK_CHANNEL_IDS")
                }
            },
            client_session_timeout_seconds=60,  # Slack API操作用に60秒に延長
            max_retry_attempts=2,  # 失敗時に最大2回リトライ
        )
        await self.slack_server.__aenter__()

        return self

    async def __aexit__(self, exc_type, exc_val, exc_tb):
        """非同期コンテキストマネージャーの終了"""
        if self.slack_server:
            await self.slack_server.__aexit__(exc_type, exc_val, exc_tb)
        if self.playwright_server:
            await self.playwright_server.__aexit__(exc_type, exc_val, exc_tb)

    def get_mcp_servers(self):
        """接続済みのMCPサーバーリストを取得"""
        return [self.playwright_server, self.slack_server]