using System.Collections.Generic;
using UnityEngine;
using Articy.Touhou;
/// 
/// 关卡池化管理
/// 
namespace Game
{
    public enum ELevelType
    {
        Home,
        Battle,
        BattleElite,
        BattleBoss,
        BattleBigBoss,
        BattleFinalBoss,
        Store,
        Treasure,
        Money,
        Random,
        Drama,
        Rest,
        None = 99,
    }
    public class LevelPoolManager : ObjectPoolBase
    {
        private readonly string _mLevelPath = "Level/";
        private LevelPoolItem _mCurLevel;
        private List _mFinishedLevel = new List();
        private float _mLoadingTimeLeft;
        private Dictionary _mDoorTypeDict = new Dictionary();//关卡类型对应门的实体id
        private bool _isAIDirectorInit = false;
        public override void Update()
        {
            if (_mLoadingTimeLeft == 0)
            {
                return;
            }
            _mLoadingTimeLeft -= Time.deltaTime;
            if (_mLoadingTimeLeft <= 0)
            {
                _mLoadingTimeLeft = 0;
                Loading(false);
            }
        }
        public override void OnDestroy()
        {
        }
        public void EnterLevel(string levelId)
        {
            if (string.IsNullOrEmpty(levelId))
            {
                Util.Print("关卡id为空");
                return;
            }
            if (_mCurLevel != null)
            {
                _mCurLevel.Destroy();
            }
            EnterLevelReal(levelId);
        }
        private void EnterLevelReal(string levelId)
        {
            Loading(true);
            var levelNew = Create($"Level{levelId.ToString()}", (item) =>
            {
                var cfg = Util.GetConfig(levelId);
                if (!(cfg is Level))
                {
                    Util.Print("关卡id错误:", levelId);
                    return;
                }
                var cfgLevel = cfg as Level;
                item.CfgId = cfg.TechnicalName;
                item.Cfg = cfgLevel.GetFeatureLevel();
                item.Init();
            });
            levelNew.SetPlayerBorn(_mCurLevel == null ? "" : _mCurLevel.CfgId);
            _mFinishedLevel.Add(levelNew.CfgId);
            _mCurLevel = levelNew;
            _mCurLevel.CreateLevel();
        }
        public GameObject CreateLevelGo(string levelId)
        {
            var path = $"{_mLevelPath}{levelId.ToString()}";
            var go = PrefabManager.Instance.CreateGo(path);
            go.transform.parent = Root.transform;
            return go;
        }
        private void Loading(bool isLoading)
        {
            if (isLoading)
            {
                _mLoadingTimeLeft = GameConst.LoadingMinTime;
                UIManager.Instance.OpenInNew(EuiPage.Loading);
            }
            else
            {
                UIManager.Instance.OpenInNew(EuiPage.Hud);
                // TODO 显示关卡名称
                // string levelName = m_CurLevel.m_LevelNode.Text;
                // if (!string.IsNullOrEmpty(levelName))
                // {
                //     EventManager.instance.SendEvent(EEvent.ShowLevelName, levelName);
                // }
            }
        }
        private void LoadDoorTypeDict()
        {
            var cfgs = Util.GetDoorConfigDataAll();
            foreach (var item in cfgs)
            {
                var cfg = item.Template.Door;
                _mDoorTypeDict[(ELevelType)cfg.LevelType] = item.TechnicalName;
            }
        }
        public string GetDoorId(ELevelType levelType)
        {
            if (!_mDoorTypeDict.ContainsKey(levelType))
            {
                Util.Print("无该类型的传送门:", levelType);
                return "";
            }
            return _mDoorTypeDict[levelType];
        }
        public LevelPoolItem GetCurLevel()
        {
            return _mCurLevel;
        }
        public LevelNodeMonsterWave GetCurWave()
        {
            return _mCurLevel.CurWave;
        }
        public bool IsLevelLoading()
        {
            return _mLoadingTimeLeft > 0;
        }
        public List GetFinishedLevel()
        {
            return _mFinishedLevel;
        }
        public int GetDifficulty()
        {
            return _mCurLevel.Cfg.Difficulty;
        }
        public bool GetAIDirectorInit()
        {
            return _isAIDirectorInit;
        }
        public void SetAIDirectorInit()
        {
            _isAIDirectorInit = true;
        }
        public int GetModuleNum(EAIModuleType type)
        {
            if (_mCurLevel == null)
            {
                return 0;
            }
            if (_mCurLevel.CurWave == null)
            {
                return 0;
            }
            return _mCurLevel.CurWave.GetModuleNum(type);
        }
    }
}
namespace Game
{
    public abstract partial class Util
    {
        public static void EnterLevel(string levelId)
        {
            LevelPoolManager.Instance.EnterLevel(levelId);
        }
        public static LevelPoolItem GetCurLevel()
        {
            return LevelPoolManager.Instance.GetCurLevel();
        }
        public static LevelNodeMonsterWave GetCurWave()
        {
            return LevelPoolManager.Instance.GetCurWave();
        }
        public static int GetDifficulty()
        {
            return LevelPoolManager.Instance.GetDifficulty();
        }
        public static bool IsLevelLoading()
        {
            return LevelPoolManager.Instance.IsLevelLoading();
        }
        public static List GetFinishedLevel()
        {
            return LevelPoolManager.Instance.GetFinishedLevel();
        }
        public static bool GetAIDirectorInit()
        {
            return LevelPoolManager.Instance.GetAIDirectorInit();
        }
        public static void SetAIDirectorInit()
        {
            LevelPoolManager.Instance.SetAIDirectorInit();
        }
        public static int GetModuleNum(EAIModuleType type)
        {
            return LevelPoolManager.Instance.GetModuleNum(type);
        }
    }
}