using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Fort23.UTool;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Serialization;
using UnityEngine.U2D;
using UnityEngine.UI.PackgTool;

namespace UnityEngine.UI
{
    /// <summary>
    /// Image is a textured element in the UI hierarchy.
    /// </summary>
    [RequireComponent(typeof(CanvasRenderer))]
    [AddComponentMenu("UI/MyImage", 11)]
    /// <summary>
    ///   Displays a Sprite inside the UI System.
    /// </summary>
    public class MyImage : Image
    {
        public string icon_name
        {
            get { return _icon_name; }
            set
            {
                _icon_name = value;
                ReashUI();
            }
        }

        // private Sprite _packSprite;
        //
        // public Sprite GetPackSprite
        // {
        //     get { return _packSprite; }
        // }
        [SerializeField] private string _icon_name;
        [SerializeField] public bool isNotLoadDeftIcon;
        [SerializeField] public SpriteAtlas CurrSpriteAtlas;
        [SerializeField] public PackInfo packInfo;
        private UILoadSpriteHand _uiLoadSpriteHand;

        public System.Action onSpriteAlter;
        
        protected override void Awake()
        {
            if (Application.isPlaying && isNotLoadDeftIcon)
            {
                return;
            }

            if (!string.IsNullOrEmpty(_icon_name))
            {
                icon_name = _icon_name;
            }
        }
        protected override void OnDestroy()
        {
            if (_uiLoadSpriteHand != null)
            {
                _uiLoadSpriteHand.ReleaseUI();
                _uiLoadSpriteHand = null;
            }
            base.OnDestroy();
        }
        public void ReashUI()
        {
            if (CurrSpriteAtlas != null && !string.IsNullOrEmpty(_icon_name))
            {
                Sprite loadSprite = CurrSpriteAtlas.GetSprite(_icon_name);
                if (loadSprite == null)
                {
                    if (Application.isPlaying)
                    {
                        SpriteAtlas spriteAtlas = UGUIPackManager.Instance.GetSpriteAtlas(_icon_name);
                        if (spriteAtlas != null)
                        {
                            loadSprite = spriteAtlas.GetSprite(_icon_name);
                        }

                        if (loadSprite == null)
                        {
                            enabled = false;
                            UGUIIamgeTool.Load(_icon_name, delegate(UILoadSpriteHand sprite1)
                            {
                                enabled = true;
                                if (Application.isPlaying)
                                {
                                    if (_uiLoadSpriteHand != null)
                                    {
                                        _uiLoadSpriteHand.ReleaseUI();
                                    }
                                }

                                _uiLoadSpriteHand = sprite1;
                                if (sprite1 == null)
                                {
                                    sprite = null;
                                }
                                else
                                {
                                    sprite = sprite1.GetSprite();
                                }
                            });
                        }
                        else
                        {
                            sprite = loadSprite;
                        }
                    }
                }
                else
                {
                    sprite = loadSprite;
                }
            }
            else if (!string.IsNullOrEmpty(_icon_name) && sprite == null)
            {
                if (Application.isPlaying)
                {
                    enabled = false;
                    UGUIIamgeTool.Load(_icon_name, delegate(UILoadSpriteHand sprite1)
                    {
                        enabled = true;
                        if (_uiLoadSpriteHand != null)
                        {
                            _uiLoadSpriteHand.ReleaseUI();
                        }

                        _uiLoadSpriteHand = sprite1;
                        if (sprite1 == null)
                        {
                            sprite = null;
                        }
                        else
                        {
                            sprite = sprite1.GetSprite();
                        }
                    });
                }
            }

            else if (!string.IsNullOrEmpty(_icon_name))
            {
                if (Application.isPlaying)
                {
                    enabled = false;
                    UGUIIamgeTool.Load(_icon_name, delegate(UILoadSpriteHand sprite1)
                    {
                        enabled = true;
                        if (sprite1 != null)
                        {
                            Sprite sp = sprite1.GetSprite();
                            if (sp != null)
                            {
                                if (!sp.name.Equals(_icon_name))
                                {
                                    sprite1.ReleaseUI();
                                    return;
                                }
                            }
                        }

                        if (_uiLoadSpriteHand != null)
                        {
                            _uiLoadSpriteHand.ReleaseUI();
                        }

                        _uiLoadSpriteHand = sprite1;
                        if (sprite1 == null)
                        {
                            sprite = null;
                        }
                        else
                        {
                            sprite = sprite1.GetSprite();
                        }
                    });
                }
            }
        }
        public override void GraphicUpdateComplete()
        {
            SetPack();
        }
        private void SetPack()
        {
#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                bool isoK = false;

                if (packInfo != null && CurrSpriteAtlas != null)
                {
                    string assetName = icon_name;
                    if (string.IsNullOrEmpty(icon_name) && sprite != null)
                    {
                        assetName = sprite.name;
                    }

                    isoK = CurrSpriteAtlas.GetSprite(assetName) != null;
                    if (!isoK) //没在在图集里面找到图片了，需要去其他地方查找(删除图集)
                    {
                        SpriteAtlas newAtlas = UGUICacheInfo.GetSpriteAtlas(assetName);
                        if (newAtlas != null)
                        {
                            CurrSpriteAtlas = newAtlas;
                            icon_name = assetName;
                        }
                        else
                        {
                            sprite = null;
                        }
                    }
                    else if (string.IsNullOrEmpty(icon_name) || sprite == null)
                    {
                        icon_name = assetName;
                    }
                }
                else if (CurrSpriteAtlas == null && packInfo != null && !string.IsNullOrEmpty(packInfo.packgJsonPath) &&
                         sprite != null) //没有图集 但是由功能管理器添加的UI （添加图集）
                {
                    string name = sprite.name;
                    SpriteAtlas newAtlas = UGUICacheInfo.GetSpriteAtlas(name);
                    if (newAtlas != null)
                    {
                        CurrSpriteAtlas = newAtlas;
                        icon_name = _icon_name;
                    }
                }
            }
#endif
        }
    }
}