"""
FastMCP 服务器启动入口。

支持 stdio、streamable-http 和 SSE 三种传输模式。
"""
import argparse
import sys
import os
import logging
from .server import mcp


def parse_args():
    """
    解析命令行参数。

    Returns:
        argparse.Namespace: 解析后的参数
    """
    parser = argparse.ArgumentParser(
        description="启动 Web Search MCP 服务器",
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )

    parser.add_argument(
        "--transport",
        type=str,
        choices=["stdio", "http", "sse"],
        default="stdio",
        help="传输模式 (stdio/http/sse)，默认: stdio",
    )

    parser.add_argument(
        "--port",
        type=int,
        default=int(os.getenv("PORT", "8000")),
        help="端口号 (http/sse 模式)，默认: 8000",
    )

    return parser.parse_args()


def validate_args(args):
    """
    验证命令行参数。

    Args:
        args: argparse.Namespace

    Raises:
        SystemExit: 参数无效时退出
    """
    # 验证端口范围
    if args.port < 1 or args.port > 65535:
        print(f"错误: 端口号必须在 1-65535 范围内，收到: {args.port}", file=sys.stderr)
        sys.exit(1)

    # stdio 模式忽略端口参数，但给出提示
    if args.transport == "stdio":
        print("注意: stdio 模式忽略 --port 参数", file=sys.stderr)


def main():
    """主函数：解析参数、配置日志、启动服务器。"""
    try:
        # 解析和验证参数
        args = parse_args()
        validate_args(args)

        # 配置日志
        log_level_str = os.getenv("LOG_LEVEL", "INFO")
        log_level = getattr(logging, log_level_str.upper(), logging.INFO)

        if args.transport == "stdio":
            # stdio 模式：日志输出到 stderr（避免与 stdout 的 MCP 通信冲突）
            logging.basicConfig(
                level=log_level,
                format="%(asctime)s %(levelname)s %(name)s %(message)s",
                handlers=[logging.StreamHandler(sys.stderr)],
            )
        else:
            # http/sse 模式：日志输出到 stdout
            logging.basicConfig(
                level=log_level,
                format="%(asctime)s %(levelname)s %(name)s %(message)s",
            )

        logger = logging.getLogger(__name__)

        # 启动服务器
        if args.transport == "stdio":
            logger.info("启动 stdio 模式服务器...")
            mcp.run(transport="stdio", show_banner=False)
        elif args.transport == "http":
            logger.info(f"启动 streamable-http 模式服务器，端口: {args.port}...")
            mcp.run(
                transport="streamable-http",
                port=args.port,
                stateless=True,
                log_level=log_level_str,
            )
        elif args.transport == "sse":
            logger.info(f"启动 SSE 模式服务器，端口: {args.port}...")
            mcp.run(
                transport="sse",
                port=args.port,
                log_level=log_level_str,
            )

    except KeyboardInterrupt:
        print("\n收到中断信号，正在关闭服务器...", file=sys.stderr)
        sys.exit(0)
    except Exception as e:
        print(f"启动失败: {e}", file=sys.stderr)
        sys.exit(2)


if __name__ == "__main__":
    main()
