import { _decorator, assetManager, Component, director, Label, Node, PhysicsSystem, Vec3 } from 'cc';
import { RoundBall } from './RoundBall';
import { GameOverScreen } from './GameOverScreen';
import { PlayerController } from './PlayerController';
import { tgxUIAlert } from '../../core_tgx/tgx';
import { AreanNetMgr } from '../../module_arean/scripts/AreanNetMgr';
const { ccclass, property } = _decorator;

@ccclass('GameManager')
export class GameManager extends Component {

    /**
     * 游戏结束
     */
    public isGameOver: boolean = false;

    myBallNum: number =10;
    opBallNum: number = 10;
    deadBallNum: number = 0;
    rndBallNum: number = 0;

    @property({
        type: PlayerController,
        displayName: "角色控制"
    })
    playerCtrl: PlayerController | null = null;
    @property({
        type: RoundBall,
        displayName: "球控制"
    })
    ballCtrl: RoundBall | null = null;



    @property({
        type: Node,
        displayName: "游戏结束界面"
    })
    gameOverScreen: Node | null = null;

    @property({
        type: Label,
        displayName: "我方弹珠数量"
    })
    myBallNumLabel: Label | null = null;

    @property({
        type: Label,
        displayName: "对方弹珠数量"
    })
    opBallNumLabel: Label | null = null;

    @property({
        type: Label,
        displayName: "放置弹珠数量"
    })
    rndBallNumLabel: Label | null = null;

    @property({
        type: Label,
        displayName: "击中弹珠数量"
    })
    deadBallNumLabel: Label | null = null;


    start() {
        PhysicsSystem.instance.enable = true;
        PhysicsSystem.instance.gravity = new Vec3(0, -10, 0);
        PhysicsSystem.instance.allowSleep = false;
        this.gameOverScreen!.active = false;
    
    }


    AddBall() {
        console.log("添加球");
        if (this.playerCtrl) {
            this.playerCtrl.AddBall();
        }
    }
    public setGameOver(isWin: boolean) {
        //this.gameOverScreen!.active =true;
        this.gameOverScreen!.getComponent(GameOverScreen)?.setResult(isWin);
    }

    public RestartGame() {

        this.myBallNum =10;
        this.opBallNum = 10;
        this.deadBallNum = 0;
        this.rndBallNum = 0;
        this.refreshBallNum();

        if (this.playerCtrl) {
            this.playerCtrl.resetGame();
        }
        if (this.ballCtrl) {
            this.ballCtrl.resetGame();
        }
        this.gameOverScreen!.active = false;
    }

    // update(deltaTime: number) {
    //     if (this.playerCtrl) {
    //         if (this.playerCtrl.IsMoveEnd()) {
    //             if (this.ballCtrl && this.ballCtrl.isMoveEnd()) {
    //                 console.log("球移动结束");
    //                 if (this.playerCtrl.AddBallEnd()) {
    //                     this.setGameOver(this.ballCtrl.isbegin);
    //                     this.RestGame();
    //                 } else {
    //                     if (this.ballCtrl.isbegin) {
    //                         this.setGameOver(this.ballCtrl.isbegin);
    //                         this.RestGame();
    //                     }
    //                 }
    //             }
    //         }
    //     }
    // }

    refreshBallNum() {

        scrollLabelToNumber(this.myBallNumLabel!,this.myBallNum);
        scrollLabelToNumber(this.opBallNumLabel!,this.opBallNum);
        scrollLabelToNumber(this.deadBallNumLabel!,this.deadBallNum);
        scrollLabelToNumber(this.rndBallNumLabel!,this.rndBallNum);
    }

    changeGameScene()
    {
        var bundle = assetManager.getBundle('level2');
        if(bundle){
            director.loadScene("scene/level2Scene");
        }else{
            assetManager.loadBundle("level2",()=>{
                director.loadScene("scene/level2Scene");
            })
        }
    }

    onClickBtnQuit() {
		tgxUIAlert.show(`是否确认退出 ? `, true).onClick(async b => {
			if (b) {
				AreanNetMgr.inst.sendMsg_exit();
			}
		});
	}

    
}

function scrollLabelToNumber(label: Label, targetNumber: number, duration: number = 0.3) {
    const startNumber = parseInt(label.string); // 获取当前 Label 上的数字
    const startTime = Date.now(); // 记录开始时间

    const updateNumber = () => {
        // 计算已经过去的时间比例
        const elapsedTime = (Date.now() - startTime) / (duration * 1000);
        const progress = Math.min(elapsedTime, 1); // 限制在 [0, 1] 范围内

        // 计算当前数字
        const currentNumber = Math.round(startNumber + (targetNumber - startNumber) * progress);

        // 更新显示的数字
        label.string = currentNumber.toString();

        // 如果动画未结束,继续更新数字
        if (progress < 1) {
            requestAnimationFrame(updateNumber);
        }
    };

    // 开始更新数字
    updateNumber();
}