using Thousandto.Core.Base;
using System;
using System.Collections.Generic;
using System.Text;
using Thousandto.Cfg.Data;
using Thousandto.Code.Center;
using Thousandto.Core.Asset;
using UnityEngine;
using EventManager = UnityEngine.Gonbest.MagicCube.EventManager;
using EventSystemHandler = UnityEngine.Gonbest.MagicCube.EventSystemHandler;
using EventMessage = UnityEngine.Gonbest.MagicCube.EventMessage;
using EventConstDefine = UnityEngine.Gonbest.MagicCube.EventConstDefine;
using PreLoadEventDefine = UnityEngine.Gonbest.MagicCube.PreLoadEventDefine;
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;        
using FFileReader = UnityEngine.Gonbest.MagicCube.FFileReader;

namespace Thousandto.Code.Logic
{
    /// <summary>
    /// 资源预加载
    /// </summary>
    public class PreloadAssetsSystem
    {
        private AssetPreLoader _loader = new AssetPreLoader();

        public void Initialize()
        {
            _loader.OnFinishedHandler = EnterGame;
            _loader.OnProgressHandler = OnProgress;


        }

        public void Unitialize()
        {
            _loader.OnFinishedHandler = null;
            _loader.OnProgressHandler = null;
        }

        //预加载完成,进入游戏
        public void EnterGame()
        {
            EventManager.SharedInstance.PushFixEvent(PreLoadEventDefine.EID_STEP_START, 5);
            GameCenter.GameStateSystem.ChangeState((int)GameStateId.Login);
        }

        public void OnProgress(float pValue)
        {
            GameCenter.UpdateSystem.SetPreloadedCount(_loader.LoadedCount);
        }

        //开始预加载
        public void StartLoad()
        {
            EventManager.SharedInstance.PushFixEvent(PreLoadEventDefine.EID_STEP_START, 4);
            ReadyAllChars(x=> {
                _loader.AllChars = x;
                FLogger.Log("ReadAllChars Count:", x.Length.ToString());
            });
            _loader.PathList = ReadyAssetPaths();
#if !UNITY_EDITOR || FUNCELL_LAUNCHER
            //这里特效纹理的Bundle必须预先加载,要不然第一个显示的特效就会出现方块。
            VFXTextureAssetsLoader.PreLoadBundle(() => 
            { 
                GameCenter.UpdateSystem.SetPreloadTotal(_loader.PathList.Count);
                _loader.Start();
            });
#else
            GameCenter.UpdateSystem.SetPreloadTotal(_loader.PathList.Count);
            _loader.Start();
#endif
        }

        //准备资源路径
        private List<PreLoadAssetInfo> ReadyAssetPaths()
        {
            List<PreLoadAssetInfo> result = new List<PreLoadAssetInfo>();
            var itor = DeclarePreload.CacheData.GetEnumerator();
            while (itor.MoveNext())
            {
                result.Add(new PreLoadAssetInfo() { Type = itor.Current.Value.Type, AssetName = itor.Current.Value.Path });
            }
            //强制预加载主界面
#if USE_PC_MODEL
            result.Add(new PreLoadAssetInfo() { Type = 9, AssetName = "UIMainFormPC" });
#else
            result.Add(new PreLoadAssetInfo() { Type = 9, AssetName = "UIMainForm" });
#endif
            return result;
        }


        //处理所有的字体字符串
        private void ReadyAllChars(Action<string> callBack)
        {
            //只针对中文和台湾进行字符串处理
            if (LanguageSystem.Lang == LanguageConstDefine.CH || LanguageSystem.Lang == LanguageConstDefine.TW)
            {
                //如果空余内存大于300M,或者总内存为1200,则重新刷新UIFont
                if (HardwareManager.MemoryInfo.GetFreeMemory() > 300 || HardwareManager.MemoryInfo.GetSumMemory() > 1200)
                {
                    //如果系统能支持2048大小的图片
                    if (SystemInfo.maxTextureSize >= 2048)
                    {
                        var fileName = string.Format(FileUtils.AllCharConfigPath, LanguageSystem.Lang);
                        FLogger.Log("ReadAllChars File:", fileName);
                        FFileReader.ReadTextAsync(fileName, callBack);                        
                        return;
                    }
                }
            }
            callBack(string.Empty);
        }       
    }
}