import { find } from "cc";
import { BaseState } from "../../Framework/FSM/BaseState";
import { UIMgr } from "../../Framework/UI/UIMgr";
import { PlayerInfo } from "../../Shared/protocols/MsgResLogin";
import { UIGame } from "../Game/UIGame";
import { World } from "../Game/World";

/**
 * 应用游戏状态
 * 职责:
 * - 加载游戏场景
 * - 初始化玩家角色
 * - 监听服务器广播(其他玩家加入、移动等)
 * - 游戏主循环
 */
export class AppStatusGame extends BaseState {
    private _player: PlayerInfo = null;
    private _isNewPlayer: boolean = false;
    private _uiGame: UIGame = null;

    constructor(fsm: any) {
        super(fsm, "Game");
    }

    /**
     * 进入游戏状态
     */
    async onEnter(params?: any): Promise<void> {
        super.onEnter(params);

        console.log("[AppStatusGame] 进入游戏世界");

        // 保存玩家信息
        if (params) {
            this._player = params.player || null;
            this._isNewPlayer = params.isNewPlayer || false;
            console.log(`[AppStatusGame] 玩家信息:`, this._player);
            console.log(`[AppStatusGame] 是否新玩家: ${this._isNewPlayer}`);
        }

        try {
            // 1. 加载游戏场景
            await this.loadGameScene();

            // 2. 初始化游戏
            await this.initGame();

            // 3. 开始监听服务器广播
            this.listenServerMessages();

            // 4. 开始游戏
            this.startGame();

        } catch (error) {
            console.error("[AppStatusGame] 进入游戏失败:", error);
            // 返回登录
            this._fsm.changeState("Login");
        }
    }

    /**
     * 加载游戏场景
     */
    private async loadGameScene(): Promise<void> {
        console.log("[AppStatusGame] 加载游戏场景...");

        // 加载游戏UI
        this._uiGame = await UIMgr.getInstance().load(UIGame);

        console.log("[AppStatusGame] 游戏场景加载完成");
    }

    /**
     * 初始化游戏
     */
    private async initGame(): Promise<void> {
        console.log("[AppStatusGame] 初始化游戏...");

        if (!this._uiGame) {
            throw new Error("UIGame 未加载");
        }

        // 获取世界根节点
        const worldRoot = find("Game")
        if (!worldRoot) {
            throw new Error("世界根节点未找到");
        }

        // 初始化世界,传入本地玩家信息
        await World.getInstance().init(worldRoot, this._player);

        console.log("[AppStatusGame] 游戏初始化完成");
    }

    /**
     * 监听服务器广播消息
     */
    private listenServerMessages(): void {
        console.log("[AppStatusGame] 开始监听服务器广播...");

        // 网络消息监听已在 World 中注册
        // World 会自动处理 MsgPlayerJoin 和 MsgPlayerMove

        console.log("[AppStatusGame] 服务器广播监听已设置");
    }

    /**
     * 开始游戏
     */
    private startGame(): void {
        console.log("[AppStatusGame] 游戏开始!");

        // 游戏已启动,玩家可以通过 WASD 控制角色移动
    }

    /**
     * 更新游戏状态(每帧调用)
     */
    onUpdate(dt: number): void {
        // TODO: 游戏主循环逻辑
        // - 更新角色位置
        // - 检测碰撞
        // - 更新敌人AI
        // - 同步网络状态
    }

    /**
     * 暂停游戏
     */
    pauseGame(): void {
        console.log("[AppStatusGame] 游戏暂停");
        // TODO: 暂停游戏逻辑
        // - 停止游戏更新
        // - 显示暂停菜单
    }

    /**
     * 恢复游戏
     */
    resumeGame(): void {
        console.log("[AppStatusGame] 游戏恢复");
        // TODO: 恢复游戏逻辑
        // - 继续游戏更新
        // - 隐藏暂停菜单
    }

    /**
     * 玩家死亡
     */
    onPlayerDeath(): void {
        console.log("[AppStatusGame] 玩家死亡");

        // TODO: 处理玩家死亡
        // - 显示死亡界面
        // - 显示复活选项或返回登录

        // 延迟后返回登录
        setTimeout(() => {
            this._fsm.changeState("Login");
        }, 3000);
    }

    /**
     * 退出游戏(返回登录)
     */
    quitGame(): void {
        console.log("[AppStatusGame] 退出游戏");

        // TODO: 断开连接或通知服务器
        // const netManager = NetManager.getInstance();
        // await netManager.disconnect();

        // 返回登录
        this._fsm.changeState("Login");
    }

    /**
     * 延迟辅助函数
     */
    private delay(ms: number): Promise<void> {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    /**
     * 退出游戏状态
     */
    onExit(): void {
        super.onExit();
        console.log("[AppStatusGame] 离开游戏状态");

        // 清理世界
        World.clear();

        // 卸载游戏UI
        if (this._uiGame) {
            UIMgr.getInstance().unload(UIGame);
            this._uiGame = null;
        }

        this._player = null;
    }
}
