using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using Game.Plugins.App;
using Plugins.JNGame.Sync.Frame;
using Plugins.JNGame.Util;
using UnityEngine;
using UnityEngine.SceneManagement;
using Object = UnityEngine.Object;

namespace Script.battle
{
    //各种模式场景
    public enum GBattleMode
    {
        Not = -1,
        Default = 0
    }

    //初始化参数类
    public class GBattleModeInfo
    {
        public List<GameObject> modes;
        public GameObject root;
    }
    
    //全局战斗模式管理器
    public class GBattleModeManager : SingletonScene<GBattleModeManager>
    {
        
        private static readonly string[] Worlds = { "WorldSceneMode", };
        
        //当前模式
        private GBattleMode _current = GBattleMode.Default;
        
        //当前模式实体
        public Object root;
        
        //是否本地模式
        public Boolean isLocalMode = false;
        
        //获取当前模式
        public T GetMode<T>() where T : class
        {
            return root as T;
        }
        
        //初始化管理器
        public void Init(GBattleModeInfo info)
        {
            // App.Event.AddListener(JNSyncFrameEvent.CREATE,LoadScene);
            // App.Event.AddListener(JNSyncFrameEvent.CLEAR,UnloadScene);
        }
    
        //打开指定模式
        public async UniTask Open(GBattleMode mode, Boolean isLocalMode = false)
        {
            
            //销毁之前模式
            await OnReset(mode);
            //是否单机模式
            this.isLocalMode = isLocalMode;
            //开始同步
            App.Sync.OnStart();

        }
        
        //重置当前模式
        public async UniTask OnReset(GBattleMode mode)
        {
            await this.UnloadScene(mode);
            App.Sync.OnReset();
            _current = mode;
            await this.LoadScene();
        }
        
        //获取场景名称
        public string GetWorldName(GBattleMode mode)
        {
            return Worlds[(int)mode];
        }

        //加载场景
        private async UniTask LoadScene()
        {
            GBattleMode mode = this._current;
            if (mode == GBattleMode.Not) return;
            Debug.Log($"[GBattleModeManager] 打开场景{GetWorldName(mode)}");
            await SceneManager.LoadSceneAsync(GetWorldName(mode));
            await UniTask.NextFrame();
        }
        
        //销毁所有场景
        private async UniTask UnloadScene(GBattleMode mode)
        {
            
            Debug.Log($"[GBattleModeManager] 关闭场景");
            await SceneManager.UnloadSceneAsync(GetWorldName(mode));
            await UniTask.NextFrame();
            
        }
        
        //刷新模式
        private void Update()
        {
            App.Sync.Update((int)(Time.deltaTime * 1000));
        }
    }
    
}