using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using GCGame.Table;
using UnityEngine.UI;

public class OtherPlayerSkillInfoCtr : MonoBehaviour {
    public static OtherPlayerSkillInfoCtr Instance;
    private void Awake()
    {
        Instance = this;
    }

    private void OnDestroy()
    {
        Instance = null;
    }

    public SkillRootPage _SkillInfoPage;
    public UISubScollMenu _SkillClasses;
    private Dictionary<string, List<SkillRootItem.SkillShowInfo>> _MySkillInfos;
    private SkillRootItem.SkillShowInfo _SelectedSkillShow;

    #region skill Desc

    public Text _SkillName;
    public Text _SkillCurDesc;
    public Text _SkillNextDesc;
    public Text _LeardNeedLv;
    public Text _LeardNeedPreSkill;
    public Text _Xiuwei;
    public Image[] _DamageTypes;

    //public Image[] _DamageTypes;

    #endregion

    // 入口
    // 网络包返回后,会调用此函数显示界面
    public void InitSkillInfo()
    {
        InitSkillItems();
        _SkillClasses.Clear();
        foreach (var skillClass in _MySkillInfos)
        {
            _SkillClasses.PushMenu(skillClass.Key);
        }
        _SkillClasses.ShowDefaultFirst();
        OnSkillClassPage(_SkillClasses.SelectedSub1);
    }
    
    private void InitSkillItems()
    {
        // 全部可学技能列表,为未分类
        var totleList = new List<SkillRootItem.SkillShowInfo>();
        // 分类过后的全部技能列表
        _MySkillInfos = new Dictionary<string, List<SkillRootItem.SkillShowInfo>>();

        var skillActives = TableManager.GetSkillActive().Values;
        var skillCount = 0;
        foreach (var skill in skillActives)
        {
            if (skill.Profession == GameManager.gameManager.OtherPlayerData.Profession)
                skillCount++;
        }
        // 保存玩家已经学的技能
        for (int i = 0; i < GameManager.gameManager.OtherPlayerData.OwnSkillInfo.Length; ++i)
        {
            //if (skillInfo.SkillLevelTable == null)
            //    continue;

            //潜规则,这两个位置默认存放试用技能
            if (i == skillCount - 1 || i == skillCount - 2)
                continue;

            var skillInfo = GameManager.gameManager.OtherPlayerData.OwnSkillInfo[i];

            var showInfo = new SkillRootItem.SkillShowInfo();
            showInfo.SkillExTab = skillInfo.SkillExTable;
            if (showInfo.SkillExTab == null)
                continue;

            showInfo.SkillBase = skillInfo.SkillBaseTable;
            Tab_SkillLevelUp skillnext = TableManager.GetSkillLevelUpByID(skillInfo.SkillExTable.NextSkillId, 0);
            showInfo.SkillLevelUp = skillnext;
            totleList.Add(showInfo);
        }

        // 获得所有可学技能列表
        var learnList = TableManager.GetSkillLearn().Values;
        foreach (var tabAct in learnList)
        {
            if (tabAct.Profession != GameManager.gameManager.OtherPlayerData.Profession)
                continue;

            // 获取每个技能相关信息
            Tab_SkillEx skillEx = TableManager.GetSkillExByID(tabAct.SkillId, 0);
            Tab_SkillBase skillBase = TableManager.GetSkillBaseByID(skillEx.BaseId, 0);

            var skillInfo = totleList.Find((showInfo) =>
            {
                if (showInfo.SkillBase.Id == skillEx.BaseId)
                {
                    return true;
                }
                return false;
            });

            if (skillInfo != null)
            {
                skillInfo.SkillLearn = tabAct;
            }
            else
            {
                SkillRootItem.SkillShowInfo showInfo = new SkillRootItem.SkillShowInfo();
                showInfo.SkillLearn = tabAct;
                showInfo.SkillBase = skillBase;
                showInfo.SkillLevelUp = TableManager.GetSkillLevelUpByID(skillEx.SkillExID, 0);
                totleList.Add(showInfo);
            }
        }

        // 将已学和没学的技能,按照类型存入字典
        foreach (var showInfo in totleList)
        {
            if (showInfo.SkillLearn == null)
                continue;

            if (_MySkillInfos.ContainsKey(showInfo.SkillLearn.Class))
            {
                _MySkillInfos[showInfo.SkillLearn.Class].Add(showInfo);
            }
            else
            {
                List<SkillRootItem.SkillShowInfo> showList = new List<SkillRootItem.SkillShowInfo>();
                showList.Add(showInfo);
                _MySkillInfos.Add(showInfo.SkillLearn.Class, showList);
            }
        }
    }

    // 技能左侧菜单点击回调
    public void OnSkillClassPage(object paramObj)
    {
        string skillClass = paramObj as string;
        if (_MySkillInfos.ContainsKey(skillClass))
        {
            _SkillInfoPage.InitContainer(_MySkillInfos[skillClass], OnSkillItemClick, true);
            _SkillInfoPage.SelectItem(_SelectedSkillShow);
        }
    }

    // 技能点击回调
    public void OnSkillItemClick(object skillItem)
    {
        SkillRootItem.SkillShowInfo skillShowInfo = skillItem as SkillRootItem.SkillShowInfo;
        if (skillShowInfo == null)
            return;

        _SelectedSkillShow = skillShowInfo;
        InitSkillInfo(skillShowInfo);
    }

    // 显示技能详细描述
    private SkillRootItem.SkillShowInfo _SelectedSkill;
    public void InitSkillInfo(SkillRootItem.SkillShowInfo skillShowInfo)
    {
        _SelectedSkill = skillShowInfo;
        _SkillName.text = skillShowInfo.SkillBase.Name;

        if(skillShowInfo.SkillExTab != null)
        {
            _SkillCurDesc.text = skillShowInfo.SkillExTab.SkillDesc;
            _SkillCurDesc.gameObject.SetActive(true);
        }
        else
        {
            _SkillCurDesc.text = "";
            _SkillCurDesc.gameObject.SetActive(false);
        }

        // 技能类型
        string[] skillDamageType = skillShowInfo.SkillLearn.SkillType.Split(';');
        for (int i = 0; i < _DamageTypes.Length; ++i)
        {
            _DamageTypes[i].gameObject.SetActive(false);
        }
        for (int i = 0; i < skillDamageType.Length; ++i)
        {
            int index = int.Parse(skillDamageType[i]);
            _DamageTypes[index].gameObject.SetActive(true);
        }

        ShowLevelSkillCondition(skillShowInfo);

        _Xiuwei.text = StrDictionary.GetClientDictionaryString("#{2829}", GameManager.gameManager.OtherPlayerData.AbilityLevel.ToString());
    }

    // 显示技能详细描述第二部分
    private void ShowLevelSkillCondition(SkillRootItem.SkillShowInfo skillShowInfo)
    {
        if (skillShowInfo.SkillLevelUp == null)
        {
            _SkillNextDesc.text = "";
            _LeardNeedLv.text = "";
            _LeardNeedPreSkill.gameObject.SetActive(false);
            return;
        }

        var levelUpNextSkill = TableManager.GetSkillExByID(skillShowInfo.SkillLevelUp.NextSkillId, 0);
        if (levelUpNextSkill == null)
            return;

        if (levelUpNextSkill != null)
        {
            _SkillNextDesc.text = levelUpNextSkill.SkillDesc;
        }

        if (skillShowInfo.SkillLevelUp.Level > Singleton<ObjManager>.Instance.MainPlayer.BaseAttr.Level)
        {
            _LeardNeedLv.text = "<color=#ff1100>" + skillShowInfo.SkillLevelUp.Level.ToString() + "</color>";
        }
        else
        {
            _LeardNeedLv.text = "<color=#5bd55b>" + skillShowInfo.SkillLevelUp.Level.ToString() + "</color>";
        }

        var needSkill = skillShowInfo.GetNeedSkillLvUp();
        if (needSkill == null)
        {
            _LeardNeedPreSkill.gameObject.SetActive(false);
        }
        else
        {
            _LeardNeedPreSkill.gameObject.SetActive(true);
            bool alreadyLearnNeedSkill = false;
            var skillBase = TableManager.GetSkillBaseByID(needSkill.BaseId, 0);
            foreach (var skillInfo in Singleton<ObjManager>.GetInstance().MainPlayer.OwnSkillInfo)
            {
                var skillEx = skillInfo.SkillExTable;
                if (skillEx == null)
                    continue;

                if (skillEx.BaseId == needSkill.BaseId && skillEx.Level >= needSkill.Level)
                {
                    alreadyLearnNeedSkill = true;
                }
            }

            string skillName = skillBase.Name + needSkill.Level.ToString() + StrDictionary.GetClientDictionaryString("#{5120}");
            if (!alreadyLearnNeedSkill)
            {
                _LeardNeedPreSkill.text = "<color=#ff1100>" + skillName + "</color>";
            }
            else
            {
                _LeardNeedPreSkill.text = "<color=#5bd55b>" + skillName + "</color>";
            }
        }
    }
}