# -*- coding: utf-8 -*-
"""CLI argument parsing and entrypoint."""

from entrypoints.cli.runtime import *
from entrypoints.cli.runtime import _help_example_prog
from entrypoints.cli.extended import (
    add_extended_subparsers,
    add_json_flag,
    emit_json,
    handle_extended_command,
    is_json_output,
)
from entrypoints.cli.manager import ServerManagerCLI

def main():
    """主函数"""
    _prog = Path(sys.argv[0]).name if getattr(sys, "frozen", False) and sys.argv else "python -m entrypoints.cli"
    parser = argparse.ArgumentParser(
        prog=_prog,
        description='Server Manager - 命令行版本',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=f'''
示例:
    # 列出所有服务器
    {_help_example_prog()} list
    
    # 创建游戏服务器
    {_help_example_prog()} create --type game --id 1
    
    # 启动服务器（当前窗口，默认）
    {_help_example_prog()} start --server ddxq_game_s1
    
    # 启动服务器（新窗口后台运行）
    {_help_example_prog()} start --server ddxq_game_s1 --background
    
    # 停止服务器
    {_help_example_prog()} stop --server ddxq_game_s1
    
    # 连接服务器
    {_help_example_prog()} connect --server ddxq_game_s1
    
    # 编译代码
    {_help_example_prog()} compile
    {_help_example_prog()} compile --target proto
    
    # 重新生成 sys.config
    {_help_example_prog()} regen --server ddxq_game_s1

    # 检查状态、查看配置、检索日志
    {_help_example_prog()} status
    {_help_example_prog()} config show --server ddxq_game_s1
    {_help_example_prog()} logs search ddxq_game_s1 error
'''
    )
    
    # 全局参数
    parser.add_argument('--root', '-r', help='服务器根目录')
    parser.add_argument('--config', '-c', help='配置文件路径')
    parser.add_argument('--cookie', help='Erlang cookie')
    parser.add_argument('--json', action='store_true', default=False,
                        help='以 JSON 输出（支持 list/info/status/config/logs/command/ids/doctor/migrate 等命令）')
    
    # 子命令
    subparsers = parser.add_subparsers(dest='command', help='可用命令')
    
    # list 命令
    list_parser = subparsers.add_parser('list', help='列出所有服务器')
    add_json_flag(list_parser)
    
    # create 命令
    create_parser = subparsers.add_parser('create', help='创建服务器')
    create_parser.add_argument('--type', '-t', required=True, 
                               choices=['game', 'login', 'center', 'cross', 'client'],
                               help='服务器类型')
    create_parser.add_argument('--id', '-i', type=int, required=True, help='服务器ID')
    create_parser.add_argument('--prefix', '-p', help='服务器前缀 (默认: ddxq2)')
    create_parser.add_argument('--db-host', help='数据库地址')
    create_parser.add_argument('--db-port', type=int, help='数据库端口')
    create_parser.add_argument('--db-user', help='数据库用户')
    create_parser.add_argument('--db-pass', help='数据库密码')
    create_parser.add_argument('--login-node', help='登录节点')
    create_parser.add_argument('--center-node', help='中心节点')
    create_parser.add_argument('--server-name', help='服务器名称')
    create_parser.add_argument('--tcp-port', type=int, help='TCP端口')
    create_parser.add_argument('--http-port', type=int, help='HTTP端口')
    create_parser.add_argument('--open-time', help='开服时间')
    create_parser.add_argument('--overwrite', action='store_true', help='覆盖已存在的服务器')
    
    # start 命令
    start_parser = subparsers.add_parser('start', help='启动服务器')
    start_parser.add_argument('--server', '-s', required=True, help='服务器目录名')
    start_parser.add_argument('--quick', '-q', action='store_true', 
                              help='快速启动（不使用 rebar3）')
    start_parser.add_argument('--background', '-b', action='store_true',
                              help='后台运行（打开新窗口）')
    
    # stop 命令
    stop_parser = subparsers.add_parser('stop', help='停止服务器')
    stop_parser.add_argument('--server', '-s', required=True, help='服务器名称')
    
    # connect 命令
    connect_parser = subparsers.add_parser('connect', help='连接到服务器')
    connect_parser.add_argument('--server', '-s', required=True, help='服务器名称')
    connect_parser.add_argument('--ip', help='目标IP')
    
    # compile 命令
    compile_parser = subparsers.add_parser('compile', help='编译代码')
    compile_parser.add_argument('--target', '-t', 
                                choices=['all', 'code', 'proto', 'table', 'tbllog'],
                                default='all', help='编译目标')
    compile_parser.add_argument('--type', 
                                choices=['game', 'login'],
                                default='game', help='服务器类型 (game=游戏服, login=登录服)')
    
    # regen 命令
    regen_parser = subparsers.add_parser('regen', help='重新生成 sys.config')
    regen_parser.add_argument('--server', '-s', help='服务器目录名')
    regen_parser.add_argument('--all', action='store_true', help='重新生成全部服务器 sys.config')
    add_json_flag(regen_parser)
    
    # interactive 命令
    interactive_parser = subparsers.add_parser('interactive', aliases=['i'], 
                                                help='进入交互式模式')

    # mcp 命令
    mcp_parser = subparsers.add_parser('mcp', help='启动 MCP stdio 服务，供大模型直接调用')

    add_extended_subparsers(subparsers)
    
    args = parser.parse_args()

    if args.command == 'mcp':
        from mcp.server import run_stdio_server
        run_stdio_server(
            server_root=args.root,
            config_path=args.config,
            cookie=args.cookie,
        )
        return
    
    # 创建管理器实例
    cli = ServerManagerCLI(
        server_root=args.root,
        config_path=args.config,
        quiet=is_json_output(args),
    )
    
    # 覆盖 cookie（如果指定）
    if args.cookie:
        cli.cookie = args.cookie
    
    # 如果没有指定命令，进入交互式模式
    if not args.command:
        cli.interactive_menu()
        return
    
    # 执行命令
    if args.command in ('interactive', 'i'):
        cli.interactive_menu()
    
    elif args.command == 'list':
        if is_json_output(args):
            emit_json({
                "server_root": cli.server_root,
                "run_dir": cli.run_dir,
                "servers": get_server_list(cli.run_dir),
            })
        else:
            cli.list_servers()

    elif handle_extended_command(args, cli):
        return
    
    elif args.command == 'create':
        cli.create_server_cmd(
            server_type=args.type,
            server_id=args.id,
            prefix=args.prefix,
            db_host=args.db_host,
            db_user=args.db_user,
            db_pass=args.db_pass,
            db_port=args.db_port,
            login_node=args.login_node,
            center_node=args.center_node,
            server_name=args.server_name,
            tcp_port=args.tcp_port,
            http_port=args.http_port,
            open_time=args.open_time,
            overwrite=args.overwrite
        )
    
    elif args.command == 'start':
        cli.start_server(
            server_name=args.server,
            use_rebar=not args.quick,
            foreground=not args.background  # 默认前台运行，--background 时后台运行
        )
    
    elif args.command == 'stop':
        cli.stop_server(args.server)
    
    elif args.command == 'connect':
        cli.connect_server(args.server, args.ip)
    
    elif args.command == 'compile':
        cli.compile(args.target, args.type)
    
    elif args.command == 'regen':
        if not args.server:
            raise SystemExit("regen 需要 --server，或使用 --all 重新生成全部服务器")
        cli.regenerate_config(args.server)
