using Games.LogicObj;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using GCGame;
using Module.Log;
using Games.GlobeDefine;
using System.Collections.Generic;
using System;
using GCGame.Table;
using Games.Events;

public class HeartSoul : MonoBehaviour
{
    public UIImgText _Power;
    public UIContainerBase m_AddAttrs;
    public Text PulsLevel;
    public Slider HeartAllLevelSlider;
    public GameObject SliderEffect;
    public GameObject UpClassBtn;
    public GameObject UpClassPayObj;
    public Image PayQuilityIcon;
    public Image PayIcon;
    public Text PayName;
    public GameObject GetButtonObj;

    public Image CurrSelectIcon;
    public Text curSlider;
    public Text godHas;

    public GameObject ChildWnd;
    public GameObject InputFieldWnd;
    public Text CurPulsLevel;
    public GameObject PulsChildWnd1;
    public GameObject PulsTitle;
    public GameObject PulsChildWnd2;
    public GameObject PulsAddAttr;
    public GameObject PulsNeedAttr;

    public Text CostItemTip;
    public Text CostItemNum;

    public Image[] Points;
    public GameObject PointChildObj;
    private List<HeartItem> HeartItems = new List<HeartItem>();

    int m_MaxAllLevelCount = 0;
    int m_HeartLevelCount = 0;
    int m_CurrSelectHeartID = -1;

    private void Awake()
    {
        HeartItems.Clear();
        for (int i=0;i<Points.Length;i++)
        {
            GameObject newPoint = GameObject.Instantiate(PointChildObj) as GameObject;
            if(newPoint!=null)
            {
                newPoint.SetActive(true);
                newPoint.transform.SetParent(Points[i].gameObject.transform);
                newPoint.transform.localPosition = Vector3.zero;
                newPoint.transform.localScale = Vector3.one;

                HeartItem heartItem = newPoint.EnsureComponent<HeartItem>();
                HeartItems.Add(heartItem);
            }
        }
    }

    void OnEnable()
    {
        ReqGetHeartList cmd2 = new ReqGetHeartList();
        cmd2.flag = 1;
        cmd2.SendMsg();
    }

    public static int GetLearnMaxLevel(int heartID)
    {
        int count = 0;
        var heartLevels = TableManager.GetHeartLevel().Values;
        foreach (var heartLevel in heartLevels)
        {
            if (heartLevel.Level != 0
                && heartLevel.HeartID == heartID
                && heartLevel.ClassID == MeridiaSoulData.Instance.HeartClass)
                count++;
        }
        return count;
    }

    public Tab_HeartPulse GetPulseTab(int level)
    {
        var pulses = TableManager.GetHeartPulse().Values;
        foreach (var pulse in pulses)
            if (pulse.Level == level)
                return pulse;
        return null;
    }

    public void Show()
    {
        _Power.text = MeridiaSoulData.Instance.HeartTotlePower.ToString();
        PulsLevel.text = StrDictionary.GetClientDictionaryString("#{46008}", MeridiaSoulData.Instance.PulseLevel);

        Dictionary<int, MeridiaSoul.BloodVeinAttrData> attrLists = new Dictionary<int, MeridiaSoul.BloodVeinAttrData>();
        List<MeridiaSoul.BloodVeinAttrData> showLists = null;
        m_MaxAllLevelCount = 0;
        m_HeartLevelCount = 0;
        var hearts = TableManager.GetHeartAttr().Values;
        var id = 0;
        foreach (var heart in hearts)
        {
            if (HeartItems.Count > id)
                HeartItems[id].InitData(heart);
            id++;
            int heartLevel = MeridiaSoulData.Instance.GetHeartLevel(heart.Id);
            int HeartLevelID = heart.Id * 1000000 + MeridiaSoulData.Instance.HeartClass * 1000 + heartLevel;
            Tab_HeartLevel HeartLevelTab = TableManager.GetHeartLevelByID(HeartLevelID, 0);
            if (HeartLevelTab == null)
                continue;
            Tab_HeartLevel HeartLevelTabNext = TableManager.GetHeartLevelByID(HeartLevelID + 1, 0);
            int count = GetLearnMaxLevel(heart.Id);
            m_MaxAllLevelCount += count;
            m_HeartLevelCount += MeridiaSoulData.Instance.GetHeartLevel(heart.Id);

            MeridiaSoul.BloodVeinAttrData data = new MeridiaSoul.BloodVeinAttrData();
            if (HeartLevelTabNext != null)
                data.ProId = HeartLevelTabNext.AttrId1;
            else
                data.ProId = HeartLevelTab.AttrId1;
            data.ProVal = 0;
            if (data.ProId != -1)
            {
                AttrData attrData = MeridiaSoulData.Instance.GetOneHeartAddAttr(data.ProId);
                if (attrData != null)
                    data.ProVal = attrData.attrValue;
                if (attrLists.ContainsKey(data.ProId))
                {
                    data.ProVal += attrLists[data.ProId].ProVal;
                }
                attrLists[data.ProId] = data;
            }
        }
        Tab_HeartPulse heartPuls = GetPulseTab(MeridiaSoulData.Instance.PulseLevel);
        Tab_HeartPulse heartPulsNext1 = GetPulseTab(MeridiaSoulData.Instance.PulseLevel+1);
        if (heartPulsNext1 != null)
            heartPuls = heartPulsNext1;
        if(heartPuls!=null)
        {
            for (var i = 0; i < heartPuls.getAttrIdCount(); i++)
            {
                int attrID = heartPuls.GetAttrIdbyIndex(i);
                MeridiaSoul.BloodVeinAttrData data = new MeridiaSoul.BloodVeinAttrData();
                data.ProVal = 0;
                data.ProId = attrID;
                if (attrID != -1)
                {
                    AttrData attrData = MeridiaSoulData.Instance.GetOnePulseAddAttr(attrID);
                    if (attrData != null)
                        data.ProVal = attrData.attrValue;
                    if (attrLists.ContainsKey(data.ProId))
                    {
                        data.ProVal += attrLists[data.ProId].ProVal;
                    }
                    attrLists[data.ProId] = data;
                }
            }
        }
        showLists = new List<MeridiaSoul.BloodVeinAttrData>(attrLists.Values);
        m_AddAttrs.SetShowItemFinishCallFun(ShowAddAttrOver);
        m_AddAttrs.InitContentItem(showLists, null);
        if(m_HeartLevelCount>= m_MaxAllLevelCount)
        {
            ShowUpClass();
        }
        else
        {
            UpClassPayObj.SetActive(false);
            UpClassBtn.SetActive(false);
            CostItemTip.gameObject.SetActive(false);
        }
    }

    public bool IsMaxLevel(int heartID)
    {
        int HeartLevelID = heartID * 1000000 + MeridiaSoulData.Instance.HeartClass * 1000 + MeridiaSoulData.Instance.GetHeartLevel(heartID);
        Tab_HeartLevel HeartLevelTabNext = TableManager.GetHeartLevelByID(HeartLevelID + 1, 0);
        if (HeartLevelTabNext == null)
            return true;
        return false;
    }

    public void ShowAddAttrOver()
    {
        var hearts = TableManager.GetHeartAttr().Values;
        var index = -1;
        var i = 0;
        foreach (var heart in hearts)
        {
            if (heart.Id == m_CurrSelectHeartID && IsMaxLevel(heart.Id) == false)
            {
                index = i;
                break;
            }
            if (IsMaxLevel(heart.Id) == false && index == -1)
                index = i;
            i++;
        }
        if (index == -1)
            index = 0;
        SelectOneHeart(index);
    }

    public void Click_ItemToolTip()
    {
        Tab_HeartClass heartClass = TableManager.GetHeartClassByID(MeridiaSoulData.Instance.HeartClass, 0);
        if (heartClass == null)
            return;
        if (heartClass.ConsumeType != 3)
            return;
        Tab_CommonItem commonItem = TableManager.GetCommonItemByID(heartClass.ConsumeSubType, 0);
        if (commonItem == null)
            return;
        ItemTooltipsLogic.ShowItemTooltip(heartClass.ConsumeSubType, ItemTooltipsLogic.ShowType.Info, transform.position);
    }

    public void GetItem()
    {
        Tab_HeartClass heartClass = TableManager.GetHeartClassByID(MeridiaSoulData.Instance.HeartClass, 0);
        if (heartClass == null)
            return;
        if (heartClass.ConsumeType != 3)
            return;
        Tab_CommonItem commonItem = TableManager.GetCommonItemByID(heartClass.ConsumeSubType, 0);
        if (commonItem == null)
            return;
        ItemTooltipsLogic.ShowItemTooltip(commonItem.Id, ItemTooltipsLogic.ShowType.GetPath, transform.position);
    }

    public void ShowUpClass()
    {
        Tab_HeartClass heartClass = TableManager.GetHeartClassByID(MeridiaSoulData.Instance.HeartClass, 0);
        Tab_HeartClass heartClassNext = TableManager.GetHeartClassByID(MeridiaSoulData.Instance.HeartClass + 1, 0);
        if (heartClassNext == null)
        {
            CostItemTip.gameObject.SetActive(true);
            CostItemTip.text = StrDictionary.GetClientDictionaryString("#{47409}");
            UpClassPayObj.SetActive(false);
            return;
        }
        if (heartClass == null)
            return;
        if (heartClass.ConsumeType != 3)
            return;
        Tab_CommonItem commonItem = TableManager.GetCommonItemByID(heartClass.ConsumeSubType, 0);
        if (commonItem == null)
            return;
        UpClassPayObj.SetActive(true);
        UpClassBtn.SetActive(true);
        LoadAssetBundle.Instance.SetImageSprite(PayIcon,commonItem.Icon);
        LoadAssetBundle.Instance.SetImageSprite(PayQuilityIcon, Utils.GetItemQualityFrame(commonItem));
        if (commonItem.QualityEffect > 0)
        {
            CommonItemContainerItem.ShowQualityEffect(true, commonItem.QualityEffect, PayIcon.transform);
        }
        else
        {
            CommonItemContainerItem.ShowQualityEffect(false, commonItem.QualityEffect, PayIcon.transform);
        }

        int has = GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(heartClass.ConsumeSubType);
        PayName.text = commonItem.Name;
        if (heartClass.ConsumeValue > has)
        {
            CostItemNum.text = StrDictionary.GetClientDictionaryString("#{47410}", string.Format("<color=#ab423cff>{0}</color>/{1}", has, heartClass.ConsumeValue));
            GetButtonObj.SetActive(true);
        }
        else
        {
            CostItemNum.text = StrDictionary.GetClientDictionaryString("#{47410}", string.Format("<color=#21f461ff>{0}</color>/{1}", has, heartClass.ConsumeValue));
            GetButtonObj.SetActive(false);
        }
        CostItemTip.gameObject.SetActive(true);
        if (MeridiaSoulData.Instance.HeartClass == 1)
            CostItemTip.text = StrDictionary.GetClientDictionaryString("#{47407}");
        if (MeridiaSoulData.Instance.HeartClass == 2)
            CostItemTip.text = StrDictionary.GetClientDictionaryString("#{47408}");
        if (MeridiaSoulData.Instance.HeartClass == 3)
            CostItemTip.text = StrDictionary.GetClientDictionaryString("#{47409}");
    }

    public void SelectOneHeart(int index)
    {
        var hearts = TableManager.GetHeartAttr().Values;
        Tab_HeartAttr heart = null;
        var id = 0;
        foreach (var item in hearts)
        {
            if (id == index)
            {
                heart = item;
                break;
            }
            id++;
        }
        if (heart == null)
            return;
        if (m_MaxAllLevelCount <= 0)
            return;
        for(int i=0;i< HeartItems.Count;i++)
        {
            HeartItems[i].OnSelect(index == i);
            if (index == i)
                CurrSelectIcon.sprite = Points[i].sprite;
        }
        HeartAllLevelSlider.value = m_HeartLevelCount*1.0f / m_MaxAllLevelCount;
        SliderEffect.SetActive(HeartAllLevelSlider.value > 0);
        int HeartLevelID = heart.Id * 1000000 + MeridiaSoulData.Instance.HeartClass * 1000 + MeridiaSoulData.Instance.GetHeartLevel(heart.Id);
        Tab_HeartLevel HeartLevelTab = TableManager.GetHeartLevelByID(HeartLevelID, 0);
        Tab_HeartLevel HeartLevelTabNext = TableManager.GetHeartLevelByID(HeartLevelID+1, 0);
        m_CurrSelectHeartID = heart.Id;
        curSlider.text = string.Format("{0}/{1}", m_HeartLevelCount * HeartLevelTab.LevelSoulCount, m_MaxAllLevelCount * HeartLevelTab.LevelSoulCount);

        godHas.text = MeridiaSoulData.Instance.HeartCount.ToString();
        m_AddAttrs.RefreshItems();
        if (HeartLevelTabNext == null)
        {
            Tab_HeartLevel HeartLevelTabMax = TableManager.GetHeartLevelByID(HeartLevelID - 1, 0);
            if(HeartLevelTabMax!=null)
                curSlider.text = string.Format("{0}/{1}", m_HeartLevelCount * HeartLevelTabMax.LevelSoulCount, m_MaxAllLevelCount * HeartLevelTabMax.LevelSoulCount);
            return;
        }
        MeridiaSoul.BloodVeinAttrData data = new MeridiaSoul.BloodVeinAttrData();
        data.ProId = HeartLevelTabNext.AttrId1;
        data.ProVal = HeartLevelTabNext.AttrValue1;
        Hashtable addAttr = new Hashtable();
        addAttr["InitObj"] = data;
        m_AddAttrs.RefreshItems(addAttr);
    }

    public void Click_CloseFieldWn()
    {
        ChildWnd.SetActive(false);
        InputFieldWnd.SetActive(false);
    }

    List<GameObject> _CloneGameObjs = new List<GameObject>();
    public void ShowPulsWnd()
    {
        ChildWnd.SetActive(true);
        InputFieldWnd.SetActive(true);
        CurPulsLevel.text = MeridiaSoulData.Instance.PulseLevel.ToString();
        Tab_HeartPulse heartPuls = GetPulseTab(MeridiaSoulData.Instance.PulseLevel + 1);
        if (heartPuls == null)
        {
            PulsChildWnd1.SetActive(false);
            PulsTitle.SetActive(false);
            PulsChildWnd2.SetActive(true);
            return;
        }
        PulsChildWnd1.SetActive(true);
        PulsTitle.SetActive(true);
        PulsChildWnd2.SetActive(false);
        for (int i = 0; i < _CloneGameObjs.Count; i++)
        {
            _CloneGameObjs[i].SetActive(false);
            _CloneGameObjs[i].transform.SetParent(null);
            GameObject.Destroy(_CloneGameObjs[i]);
        }
        _CloneGameObjs.Clear();
        for (int i=0;i<heartPuls.getNeedAttrIdCount();i++)
        {
            CloneAttrObj(PulsNeedAttr, heartPuls.GetNeedAttrIdbyIndex(i), heartPuls.GetNeedAttrValuebyIndex(i),true);
        }
        for (int i = 0; i < heartPuls.getAttrIdCount(); i++)
        {
            CloneAttrObj(PulsAddAttr, heartPuls.GetAttrIdbyIndex(i), heartPuls.GetAttrValuebyIndex(i));
        }
    }

    void CloneAttrObj(GameObject obj, int proID, long proValue,bool add = false)
    {
        if (proID == -1)
            return;
        GameObject newObj = GameObject.Instantiate(obj);
        newObj.SetActive(true);
        newObj.transform.SetParent(obj.transform.parent);
        newObj.transform.localPosition = obj.transform.localPosition;
        newObj.transform.localScale = obj.transform.localScale;
        Text attr = newObj.GetComponent<Text>();
        if (attr != null)
            attr.text = PropID.GetAttrName((PropID.PropertyID)proID);
        Transform child = newObj.transform.Find("Text");
        if (child != null)
        {
            AttrData attrData = MeridiaSoulData.Instance.GetOneHeartAddAttr(proID);
            Text attrValue = child.GetComponent<Text>();
            if (attrValue != null)
            {
                if(add==false)
                {
                    attrValue.text = proValue.ToString();
                }
                else
                {
                    if (attrData != null && attrData.attrValue >= proValue)
                    {
                        attrValue.text = proValue.ToString();
                    }
                    else
                        attrValue.text = string.Format("<color=#ab0e0eff>{0}</color>", proValue);
                }
            }
        }
        _CloneGameObjs.Add(newObj);
    }

    public void Click_UpLevel()
    {
        Tab_HeartClass heartClassNext = TableManager.GetHeartClassByID(MeridiaSoulData.Instance.HeartClass, 0);
        if (heartClassNext == null)
        {
            GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{47406}"));
            return;
        }

        ReqUpgradeHeart cmd = new ReqUpgradeHeart();
        cmd.heartId = m_CurrSelectHeartID;
        cmd.isAuto = 0;
        cmd.SendMsg();
    }

    public void Click_UpClass()
    {
        Tab_HeartClass heartClassNext = TableManager.GetHeartClassByID(MeridiaSoulData.Instance.HeartClass + 1, 0);
        if (heartClassNext == null)
        {
            GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{47406}"));
            return;
        }

        ReqAdvanced cmd = new ReqAdvanced();
        cmd.flag = 1;
        cmd.SendMsg();
    }

    public void Click_Descript()
    {
        MessageHelpLogic.ShowHelpMessage(39);
    }
}