import asyncio
from typing import List, Dict
from dataclasses import dataclass
from .connection_pool import SwitchConnectionPool

@dataclass
class BulkSwitchConfig:
    vlan_id: int = None
    interface: str = None
    operation: str = "create"

class BulkConfigurator:
    """生产环境批量配置器"""
    def __init__(self, max_concurrent: int = 50):
        self.pool = SwitchConnectionPool()
        self.semaphore = asyncio.Semaphore(max_concurrent)

    async def _configure_device(self, ip: str, config: BulkSwitchConfig) -> str:
        """核心配置方法"""
        conn = await self.pool.get_connection(ip, "admin", "admin")
        try:
            commands = self._generate_commands(config)
            results = [await conn.run(cmd) for cmd in commands]
            return "\n".join(r.stdout for r in results)
        finally:
            await self.pool.release_connection(ip, conn)
    @staticmethod
    def _generate_commands(config: BulkSwitchConfig) -> List[str]:
        """命令生成"""
        commands = []
        if config.vlan_id:
            commands.append(f"vlan {config.vlan_id}")
            if config.operation == "create":
                commands.extend([
                    f"name VLAN_{config.vlan_id}",
                    "commit"
                ])
        return commands

    async def run_bulk(self, ip_list: List[str], config: BulkSwitchConfig) -> Dict[str, str]:
        """批量执行入口"""
        tasks = {
            ip: asyncio.create_task(self._configure_device(ip, config))
            for ip in ip_list
        }
        return {ip: await task for ip, task in tasks.items()}
