import { _decorator, BaseRenderData, Component, director, instantiate, Prefab, Node, assetManager } from 'cc';
import { tgxUIMgr, tgxUIWaiting } from '../../core_tgx/tgx';
import { areanMgr } from './AreanManager';
import { AreanEvent, AreanNetMgr } from './AreanNetMgr';
import { resLoader } from '../../core_tgx/base/utils/ResLoader';
import { ModuleDef } from '../../scripts/ModuleDef';
import { EFightModel, IAreanPlayer } from '../../module_basic/shared/protocols/public/arean/AreanTypeDef';
import { UserMgr } from '../../module_basic/scripts/UserMgr';
import { UserLocalCache } from '../../module_basic/scripts/UserLocalCache';
import { AreanPlayer } from './AreanPlayer';
const { ccclass, property } = _decorator;

@ccclass('AreanGameScene')
export class AreanGameScene extends Component {
	@property({ type: Node })
	battleLoading: Node = null;

	protected onLoad(): void {
		this.listenEvent();
		UserMgr.inst.isInGame=true;
	}

	async start() {

		areanMgr.initData();
		tgxUIMgr.inst.closeAll();
		tgxUIWaiting.show();
		let gameMode = UserLocalCache.inst.fightModel;
		switch(gameMode){
			case EFightModel.Match:
				this.GameBeginPush();
				break;
			case EFightModel.Ranking:
				this.GameBeginPush();
				break;
			case EFightModel.Room:

				if(AreanNetMgr.inst.isInGame()){
					this.GameBeginPush();
				}else{
					this.initData();
				}
				break;
		}
	}


	listenEvent() {
		
		director.on(AreanEvent.GameBegin, this.GameBeginPush, this);
	}

	GameBeginPush() {	
		tgxUIWaiting.show();
		this.battleLoading.active = true;
		let gameHUD = this.node.getChildByName("GameHUD");
		if (gameHUD) {
			this.node.removeChild(gameHUD)
		}

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


	async onCompleteCallback() {
		this.battleLoading.active = false;
		let gameMode = UserLocalCache.inst.fightModel;

		switch(gameMode){
			case EFightModel.Match:
			case EFightModel.Ranking:
				await AreanNetMgr.inst.rpc_Ready();
				console.log("准备2")
				break;
			case EFightModel.Room:
				break;
		}
		AreanNetMgr.inst.sendMsg_InBattleView();
	}


	update(deltaTime: number) {
	}

	protected onDestroy(): void {
		UserMgr.inst.isInGame=false;
	}

 async	initData() {
		resLoader.load<Prefab>(ModuleDef.Arean, "GameHUD", (err, prefab) => {
			if (err) {
				console.log("GameManager start err:", err);
				return;
			}
			if (prefab) {
				let node = instantiate(prefab);
				node.name = "GameHUD";
				this.node.addChild(node);
				tgxUIWaiting.hide();
			}
		});
	}

	

	onPlayerComes(_player: IAreanPlayer) {
		if (areanMgr.player == null) {
			this.createPlayer(_player);
		} else {
			areanMgr.player.onPlayerDataChange(_player);
		}
	}
	
	createPlayer(player: IAreanPlayer) {
		let _player = new AreanPlayer(player);
		areanMgr.player = _player;
		areanMgr.playerGroup.push(_player);

		_player.setReady(true);
	}

	createAIPlayer(levelID: number) {

	}

}