using System;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using Core.Audio;
using Core.Event.Event;
using Core.UI.UTool;
using Fort23.Core;
using Fort23.UTool;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using Utility;
using EventSystem = UnityEngine.EventSystems.EventSystem;
namespace Fort23.Mono
{
    public enum UILayer
    {
        Bottom, //最底层UI(主界面)
        Middle, //中间UI(各种Panel)
        Top, //最顶层UI节点
        Loading, // 加载界面
    }
    /// 
    /// 销毁类型
    /// 
    public enum UIDestroyType
    {
        DelayDestroy,
        ImmediatelyDestroy,
        NotDestroy,
    }
    /// 
    /// 如果有同时弹出多个UI界面冲突的地方,推荐用async/await的方法一次操作,这样就不用单独去为了适配打开多个UI的需求而改动太多的代码(主要是这样改动会牺牲大部分情况下的性能)
    /// 
    public class UIManager : Entity
    {
        public static UIManager Instance { get; set; }
        public readonly Material uiGray = new Material(Shader.Find("MyShader/UIImageGray"));
        // public RectTransform UIRootTransform;
        public Vector2 sizeDelta;
        public EventSystem current;
        /// 
        /// 父节点(InitClip)
        /// 
        private Transform _parent;
        /// 
        /// 所有展示BG的ui
        /// 
        public List AllShowBGUIs = new List();
        /// 
        /// 顶部ui列表 可以通过导航栏跳转的界面
        /// 
        public List TopUIPanels = new List();
        /// 
        /// 所有top层ui
        /// 
        public List NoFocusTopUIPanels = new List();
        /// 
        /// 预先定好的几个层,数量和UILayer对应
        /// 
        // public Canvas[] canvases = new Canvas[3];
        public Camera UICamera;
        public Canvas Canvas;
        public Transform[] UILayers = new Transform[4];
        /// 
        /// 当前打开的ui
        /// 
        public UIPanel currOpenPanel;
        /// 
        /// UI布局大小
        /// 
        private Vector2 UIScale;
        private BetterList _lastShowPanel = new BetterList();
        private Graphic currDeapthGraphic;
        /// 
        /// 需要销毁的UI
        /// 
        public Dictionary destroyUI = new Dictionary();
        public CustomCameraStack CurrCustomCameraStack
        {
            get { return _currCustomCameraStack; }
            set
            {
                _currCustomCameraStack = value;
                RefreshFull();
            }
        }
        public void CleanLastShowPanel()
        {
            _lastShowPanel.Clear();
        }
        private CustomCameraStack _currCustomCameraStack;
        /// 
        /// 屏蔽字库
        /// 
        public string MaskWordData;
        /// 
        /// 展示文字提示长度
        /// 
        public int ShowTextCount;
        /// 
        /// 展示文字提示最大长度
        /// 
        public int ShowTextMaxCount = 1;
        /// 
        /// 上一个界面
        /// 
        public UIPanel LastUIPanel;
        [CustomMethod(CustomMethodType.Awake)]
        public async void Awake(Transform parent)
        {
            Instance = this;
            _parent = parent;
        }
        public async CTask InitUI()
        {
            UGUIIamgeTool.SpriteLoad = new UISpriteLoad();
            if (Canvas == null)
            {
                AssetHandle assetBundle =
                    await AssetBundleLoadManager.Instance.LoadAssetAsyncTask("Canvas.prefab");
                GameObject prefab = assetBundle.AssetObject();
                prefab.SetActive(false);
                // UIRootTransform = prefab.GetComponent();
                sizeDelta = prefab.GetComponent().sizeDelta;
                // if (1.0f * Screen.width / Screen.height < 1334f / 750f)
                // {
                //     sizeDelta = new Vector2(1334, 750);
                // }
                // return;
                Canvas = prefab.GetComponent