import asyncio
from typing import Optional, List
from langchain_mcp_adapters.client import MultiServerMCPClient

mcp_client: Optional[MultiServerMCPClient] = None

async def get_or_create_mcp_client(mcp_url: str) -> MultiServerMCPClient:
    global mcp_client
    if mcp_client:
        return mcp_client
    
    print(f"🔌 Conectando al MCP de Aeropuerto en: {mcp_url}")
    client = MultiServerMCPClient({
        "airport": {
            "url": mcp_url,
            "transport": "streamable_http"
        }
    })
    mcp_client = client
    return mcp_client

async def get_working_mcp_tools(mcp_url: str, retries=3, delay=2) -> List:
    """Obtiene las herramientas del MCP con reintentos."""
    client = await get_or_create_mcp_client(mcp_url)
    
    for i in range(retries):
        try:
            print(f"⏳ Intentando obtener herramientas MCP (Intento {i+1}/{retries})...")
            tools = await asyncio.wait_for(client.get_tools(), timeout=15.0)
            if tools:
                return tools
        except Exception as e:
            print(f"⚠️ Error conectando MCP (Intento {i+1}): {e}")
            await asyncio.sleep(delay)
            # Forzar recreación
            global mcp_client
            mcp_client = None
            client = await get_or_create_mcp_client(mcp_url)
            
    print("❌ No se pudieron obtener herramientas del MCP tras varios intentos.")
    return []

async def close_mcp_connection():
    """Cierra la conexión MCP si existe."""
    global mcp_client
    if mcp_client:
        mcp_client = None
        print("🔌 Conexión MCP cerrada (referencia limpiada).")
