import asyncio
import json

from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_mcp_adapters.tools import load_mcp_tools
from langchain_openai import ChatOpenAI
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

from SmartVoyage.config import Config
from SmartVoyage.create_logger import logger

conf = Config()

# 初始化LLM
llm = ChatOpenAI(
    model=conf.model_name,
    base_url=conf.base_url,
    api_key=conf.api_key,
    temperature=0.1
)


async def order_tickets():
    try:
        # 启动 MCP server，通过streamable建立连接
        async with streamablehttp_client("http://127.0.0.1:8003/mcp") as (read, write, _):
            # 使用读写通道创建 MCP 会话
            async with ClientSession(read, write) as session:
                try:
                    await session.initialize()

                    # 从 session 自动获取 MCP server 提供的工具列表。
                    tools = await load_mcp_tools(session)
                    print(f"tools-->{tools}")

                    #测试订火车票
                    query = {"departure_date": "2026-07-08", "train_number": "G346", "seat_type": "二等座", "number": 1}
                    train_result = await session.call_tool("order_train", query)
                    train_result_data = json.loads(train_result) if isinstance(train_result, str) else train_result
                    print(train_result_data)

                    # 测试订飞机票
                    query = {"departure_date": "2026-07-08", "flight_number": "CA3301", "seat_type": "商务舱", "number": 1}
                    flight_result = await session.call_tool("order_flight", query)
                    flight_result_data = json.loads(flight_result) if isinstance(flight_result, str) else flight_result
                    print(flight_result_data)

                    # 测试订飞机票
                    query = {"start_date": "2026-07-09", "aritist": "刀郎", "venue": "北京体育馆","seat_type":"看台","number": 1}
                    concert_result = await session.call_tool("order_concert", query)
                    concert_result_data = json.loads(concert_result) if isinstance(concert_result, str) else concert_result
                    print(concert_result_data)
                except Exception as e:
                    logger.info(f"票务 MCP 测试出错：{str(e)}")
    except Exception as e:
        logger.error(f"连接或会话初始化时发生错误: {e}")


if __name__ == "__main__":
    #测试订火车票

    asyncio.run(order_tickets())