import { _decorator, Component, director, Node } from 'cc';
import { NetGameServer } from './NetGameServer';
import { WebsocketClient } from './WebsocketClient';
import { tgxSceneUtil, tgxUIAlert, tgxUIWaiting } from '../../core_tgx/tgx';
import { SubGameMgr } from './SubGameMgr';
import { UserMgr } from './UserMgr';
import { SceneUtil } from '../../core_tgx/base/SceneUtils';
import { SceneDef } from '../../scripts/SceneDef';
const { ccclass, property } = _decorator;

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

    public static addToScene() {
        let node = new Node('NetworkReconnector');
        node.addComponent(NetworkReconnector);
        director.getScene().addChild(node);
    }

    private _isInGame = false;
    start() {
        NetGameServer.inst.on(WebsocketClient.EVENT_DISCONNECTED, this.onDisconnected, this);
        this._isInGame = director.getScene().name.indexOf('game_') == 0;
    }

    onDisconnected(v) {
        if(v.reason == 'login_to_other'){
            tgxUIAlert.show('账号在其他地方登录!').onClick(()=>{
                tgxSceneUtil.loadScene(SceneDef.LOGIN);
            });
            return;
        }
        if (v.reason == 'normal' || v.reason == 'USER_LEAVE') {
            return;
        }
        if (!v.isManual) {
            //this.backToLogin();
            this.tryReconnect();
        }
    }

    private async tryReconnect() {
        tgxUIWaiting.show('正在重连');
        let isSucc = false;
        if (this._isInGame) {
            let ret = await SubGameMgr.inst.enterSubGame(NetGameServer.inst.authParams,UserMgr.inst.uid);
            if (ret.isSucc) {
                isSucc = true;
            }
            else if (ret.err.code == 'ROOM_NOT_EXISTS') {
                SubGameMgr.gameMgr.backToLobby();
                return;
            }
        }
        else {
            let params = NetGameServer.inst.authParams;
            let ret = await NetGameServer.inst.ensureConnected();
            isSucc = ret.isSucc;
            /**
             * @en if already login success, need to verify again
             * @zh 如果已经登录成功,则需要再次验证
            */
            if (ret.isSucc && params) {
                let ret1 = await NetGameServer.inst.callApi('login/AuthClient', {
                    uid: UserMgr.inst.uid,
                    token: params.token,
                    time: params.time,
                });

                if (ret1.isSucc) {
                    SceneUtil.reloadScene();
                    isSucc = true;
                }
                else {
                    tgxUIWaiting.hide();
                    tgxUIAlert.show("登录验证失败,请重新登录!").onClick(bOK => {
                        tgxSceneUtil.loadScene(SceneDef.LOGIN);
                    });
                    return;
                }
            }
        }

        /**
         * @en if re-connect failed, try again after 3s
         * @zh 如果没有重连成功,则一定时间后再次尝试
        */
        if (!isSucc) {
            setTimeout(() => {
                this.tryReconnect();
            }, 3000);
        }
        else {
            tgxUIWaiting.hide();
        }
    }

    protected onDestroy(): void {
        NetGameServer.inst.off(WebsocketClient.EVENT_DISCONNECTED, this.onDisconnected, this);
    }
}