using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using Games.Item;
using System.Collections.Generic;
using GCGame.Table;
using Games.GlobeDefine;

[System.Serializable]
public class SkillTipsInfo
{
    public int Profession;
    public int Level;
    public int SkillBaseID;
}

public class NewSkillTips : UIControllerBase<NewSkillTips>
{

    public static void OnSkillLearn(int skillId, int skillIdx)
    {
        Hashtable hash = new Hashtable();
        hash.Add("SkillID", skillId);
        hash.Add("SkillIdx", skillIdx);
        UIManager.ShowUI(UIInfo.NewSkillTips, ShowUIOver, hash);
    }

    public static void ShowUIOver(bool sucess, object param)
    {
        if (!sucess)
            return;

        Hashtable hash = param as Hashtable;
        if (hash == null)
            return;

        if (hash.ContainsKey("SkillID"))
        {
            NewSkillTips.Instance().OnSkill((int)hash["SkillID"], (int)hash["SkillIdx"]);
        }
    }

    public void OnEnable()
    {
        SetInstance(this);
    }

    public void OnDestory()
    {
        SetInstance(null);
    }

    #region 

    public static int _MAX_LEVEL = -1;

    public List<int> _ShowTipBaseID;
    public Image _SkillIcon;
    public Image _SkillName;
    public float _ShowTime = 3;
    public float _IconMoveTime = 0.6f;
    public float _CloseDelay = 0.3f;

    private bool ShowEffecting = false;
    private SkillTipsInfo _ActingTips;

    #endregion

    public void OnSkill(int skillID, int skillIdx)
    {
        
        var _mainPlayer = Singleton<ObjManager>.GetInstance().MainPlayer;
        if (_mainPlayer == null)
        {
            CloseWindow();
            return;
        }

        var tabSkill = _mainPlayer.OwnSkillInfo[skillIdx].SkillBaseTable;
        if (!_ShowTipBaseID.Contains(tabSkill.Id))
        {
            if(!ShowEffecting)
                CloseWindow();
            return;
        }

        FindIconPos(skillIdx);
        if(_TargetObj == null)
        {
            CloseWindow();
            return;
        }

        ShowSkillInfo(tabSkill);
        
    }

    public void ShowSkillInfo(Tab_SkillBase skillBase)
    {
        if (skillBase == null)
        {
            CloseWindow();
        }
        ResetMove();
        LoadAssetBundle.Instance.SetImageSprite(_SkillIcon, skillBase.Icon);
        LoadAssetBundle.Instance.SetImageSprite(_SkillName, skillBase.TextIcon);
        PlayEffect();
        StartCoroutine(PlayAnim());
    }

    public IEnumerator PlayAnim()
    {
        ShowEffecting = true;
        yield return new WaitForSeconds(_ShowTime);
        StartIconMove();
        yield return new WaitForSeconds(_IconMoveTime);
        if (_TargetObj != null)
        {
            Color alphaColor = _TargetObj.color;
            alphaColor.a = 1;
            _TargetObj.color = alphaColor;
        }
        yield return new WaitForSeconds(_CloseDelay);
        CloseWindow();
    }

    private void OnDisable()
    {
        ShowEffecting = false;
    }

    public void CloseWindow()
    {
        HideEffect();
        UIManager.CloseUI(UIInfo.NewSkillTips);
    }

    #region effect

    public GameObject _EffectPrefab;

    private GameObject _EffectInstance;

    private void InitEffect()
    {
        if (_EffectInstance == null)
        {
            var effectInstanceGO = GameObject.Instantiate(_EffectPrefab);
            effectInstanceGO.transform.SetParent(transform);
            effectInstanceGO.transform.localScale = Vector3.one;
            effectInstanceGO.AddComponent<UIParticleSystem>();
            _EffectInstance = effectInstanceGO;
        }
    }

    private void PlayEffect()
    {
        InitEffect();
        _EffectInstance.gameObject.SetActive(true);
    }

    private void HideEffect()
    {
        if (_EffectInstance != null)
        {
            _EffectInstance.gameObject.SetActive(false);
        }
    }

    #endregion

    #region icon move

    private Vector3 _IconPos = Vector3.zero;
    private float _ScaleChange = 0;
    private Image _TargetObj;

    private void FindIconPos(int skillIdx)
    {
        if (SkillBarLogic.Instance())
        {
            var canvasGroup = SkillBarLogic.Instance().gameObject.GetComponent<CanvasGroup>();
            if (canvasGroup.alpha != 1)
            {
                _TargetObj = null;
                return;
            }
        }
        for (int i = 0; i < SkillBarLogic.Instance().SkillButtons.Length; ++i)
        {
            if (SkillBarLogic.Instance().SkillButtons[i].SkillIndex == skillIdx)
            {
                if (_TargetObj != null)
                {
                    Color alphaColor1 = _TargetObj.color;
                    alphaColor1.a = 1;
                    _TargetObj.color = alphaColor1;
                }
                _TargetObj = SkillBarLogic.Instance().SkillButtons[i].skillIcon;
                _IconPos = SkillBarLogic.Instance().SkillButtons[i].skillIcon.transform.position;
                _ScaleChange = SkillBarLogic.Instance().SkillButtons[i].skillIcon.rectTransform.rect.width / _SkillIcon.rectTransform.rect.width;

                Color alphaColor = _TargetObj.color;
                alphaColor.a = 0;
                _TargetObj.color = alphaColor;
            }
        }
    }

    public void StartIconMove()
    {
        if (_IconPos == Vector3.zero)
            return;

        iTween.MoveTo(_SkillIcon.gameObject, _IconPos, _IconMoveTime);
        iTween.ScaleTo(_SkillIcon.gameObject, new Vector3(_ScaleChange, _ScaleChange, _ScaleChange), _IconMoveTime);
    }

    public void ResetMove()
    {
        Debug.Log("ResetPosition1:" + _SkillIcon.transform.position);
        _SkillIcon.transform.localPosition = Vector3.zero;
        _SkillIcon.transform.localScale = Vector3.one;
        Debug.Log("ResetPosition2:" + _SkillIcon.transform.position);
    }

    #endregion

}