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

public class EquipGemLvUpLvPanel : UIControllerBase<EquipGemLvUpLvPanel>
{
    void OnEnable()
    {
        SetInstance(this);

        if (EquipGemLvUpRoot.Instance().SelectGem != null)
        {
            OnGemSelect();
        }
    }

    void OnDisable()
    {
        SetInstance(null);
    }

    public void UpdateEquip()
    {
        _DestLevel = 0;

        _MaterialSlot.UpdateNum(GetMatGemNum());
    }

    public void CloseWindow()
    {
        UIManager.ShowUI(UIInfo.EquipEnhance);
        UIManager.CloseUI(UIInfo.EquipGemLvUp);
    }

    #region gem

    public Text _CurName;
    public Text _CurDesc;
    public UIImgText _CurCombat;
    public Text _DestName;
    public Text _DestDesc;
    public UIImgText _DestCombat;
    public Text _DestNeedLevel;
    public CommonItemMaterialSlot _MaterialSlot;
    public GameObject _DestSelectPanel;
    public UIContainerSelect _DestContainer;
    public GameObject _CurLevelPanel;
    public Vector3 _LvUpPos;
    public Vector3 _LvMaxPos;
    public GameObject _DescLevelPanel;
    public GameObject _MaxLevelPanel;

    private List<Tab_GemLvlUpConsume> _DestGems = new List<Tab_GemLvlUpConsume>();
    private Tab_GemLvlUpConsume _SelectDest;
    private Tab_GemLvlUpConsume _CurGemConsume;
    private int _DestLevel = 0;

    public void OnGemSelect()
    {

        var tabGem = TableManager.GetCommonItemByID(EquipGemLvUpRoot.Instance().SelectGem.DataID, 0);

        string gemName = tabGem.Name;
        //string levelStr = StrDictionary.GetClientDictionaryString("#{1166}", EquipGemLvUpRoot.Instance().SelectGem.Level);
        _CurName.text = Utils.GetItemQualityColor(EquipGemLvUpRoot.Instance().SelectGem.GetQuality()) + gemName + "</color>";

        int equipPos = EquipGemLvUpRoot.Instance().SelectEquip.GetEquipSlotIndex();
        var propTab = EquipGemLvUpRoot.Instance().SelectGem.GetGemPropTab(equipPos);
        string attrProStr = GemData.GetPropStr(propTab);
        _CurGemConsume = EquipGemLvUpRoot.Instance().SelectGem.GetGemLvUpConsumeTab();

        _CurDesc.text = attrProStr;
        _CurCombat.text = StrDictionary.GetClientDictionaryString("#{2829}", propTab.CombatValue);

        _DestGems.Clear();
        var tabGemLvUps = TableManager.GetGemLvlUpConsume().Values;
        foreach (var tabGemlvUP in tabGemLvUps)
        {
            if (tabGemlvUP.ConsumeSubType == _CurGemConsume.ConsumeSubType && tabGemlvUP.DesLevel > EquipGemLvUpRoot.Instance().SelectGem.Level)
            {
                _DestGems.Add(tabGemlvUP);
            }
        }

        if (_DestGems.Count > 0)
        {
            _SelectDest = _DestGems[0];
            SetDestGemInfo(_DestGems[0]);
            _CurLevelPanel.transform.localPosition = _LvUpPos;
        }
        else
        {
            SetDestGemInfo(null);
            _CurLevelPanel.transform.localPosition = _LvMaxPos;
        }

    }

    private void SetDestGemInfo(Tab_GemLvlUpConsume tabNextGem)
    {
        if (tabNextGem == null)
        {
            _DescLevelPanel.gameObject.SetActive(false);
            _MaxLevelPanel.gameObject.SetActive(true);
            return;
        }
        _DescLevelPanel.gameObject.SetActive(true);
        _MaxLevelPanel.gameObject.SetActive(false);

        var tabDestGem = TableManager.GetCommonItemByID(tabNextGem.Id, 0);

        string gemName = tabDestGem.Name;
        _DestName.text = Utils.GetItemQualityColor(EquipGemLvUpRoot.Instance().SelectGem.GetQuality()) + gemName + "</color>";

        int equipPos = EquipGemLvUpRoot.Instance().SelectEquip.GetEquipSlotIndex();
        var propTab = GemData.GetGemPropTab(tabNextGem.Id, tabNextGem.DesLevel, equipPos) ;
        string attrProStr = "";
        for (int i = 0; i < propTab.getPropIDCount(); ++i)
        {
            if (propTab.GetPropIDbyIndex(i) < 0)
                continue;

            if (!string.IsNullOrEmpty(attrProStr))
            {
                attrProStr += "\n";
            }
            attrProStr += PropID.GetAttrValue((PropID.PropertyID)propTab.GetPropIDbyIndex(i), propTab.GetPropSubIDbyIndex(i), propTab.GetPropValuebyIndex(i));
        }
        _DestDesc.text = attrProStr;
        _DestCombat.text = StrDictionary.GetClientDictionaryString("#{2829}", propTab.CombatValue);

        var levelLimitTab = TableManager.GetGemInlayLvlLimitByID(tabNextGem.DesLevel, 0);
        _DestLevel = levelLimitTab.MinLvl;
        if (_DestLevel > 0)
        {
            if (_DestLevel > GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level)
            {
                _DestNeedLevel.text = StrDictionary.GetClientDictionaryString("#{5530}") + StrDictionary.GetClientDictionaryString("#{4750}", _DestLevel) + "</color>";
            }
            else
            {
                _DestNeedLevel.text = StrDictionary.GetClientDictionaryString("#{4750}", _DestLevel);
            }
        }
        else
        {
            _DestNeedLevel.text = "";
        }

        var matCnt = GetMatGemNum();
        int comsumCnt = 0;
        int lvUpIndex = _DestGems.IndexOf(tabNextGem);
        for (int i = 0; i < lvUpIndex; ++i)
        {
            comsumCnt += _DestGems[i].ConsumeNum;
        }
        comsumCnt += _CurGemConsume.ConsumeNum;
        _MaterialSlot.InitMaterial(_CurGemConsume.ConsumeSubType, comsumCnt, false, matCnt);
        _MaterialSlot.UpdateNum(matCnt);
    }

    public void OnDestShow()
    {
        LogModule.DebugLog("OnDestShow");
        if (_DestGems.Count == 0)
        {
            LogModule.DebugLog("满级");
            return;
        }
        _DestSelectPanel.SetActive(true);
        _DestContainer.InitSelectContent(_DestGems, new List<Tab_GemLvlUpConsume>() { _SelectDest }, OnDestSelect);
    }

    public void OnDestHide()
    {
        LogModule.DebugLog("OnDestHide");
        _DestSelectPanel.SetActive(false);
    }

    public void OnDestSelect(object destObj)
    {
        Tab_GemLvlUpConsume gemLvUp = destObj as Tab_GemLvlUpConsume;
        if (gemLvUp == null)
            return;

        _SelectDest = gemLvUp;
        SetDestGemInfo(_SelectDest);
        //OnDestHide();
    }

    public void OnBtnLevelUp()
    {
        //TestGem();
        if (_DestLevel > GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level)
        {
            GUIData.AddNotifyData("#{5327}");
            return;
        }
        if (_MaterialSlot.IsMaterialEnough())
        {
            CG_GEM_LVL_UP packet = (CG_GEM_LVL_UP)PacketDistributed.CreatePacket(MessageID.PACKET_CG_GEM_LVL_UP);
            if (EquipGemLvUpRoot.Instance().SelectEquip.IsPlayerEquiped())
            {
                packet.Packtype = (int)GameItemContainer.Type.TYPE_EQUIPPACK;
            }
            else
            {
                packet.Packtype = (int)GameItemContainer.Type.TYPE_BACKPACK;
            }
            packet.Equipguid = EquipGemLvUpRoot.Instance().SelectEquip.Guid;
            packet.Gemdataid = EquipGemLvUpRoot.Instance().SelectGem.DataID;
            packet.Deslvl = _SelectDest.DesLevel;
            packet.SendPacket();
        }
        else
        {
            _MaterialSlot.ShowGetPath();
        }
    }

    private int GetMatGemNum()
    {
        int matCnt = 0;
        var itemList = ItemTool.ItemFilter(GameManager.gameManager.PlayerDataPool.BackPack, 3, 5, true);
        foreach (var gemItem in itemList)
        {
            var consumeTab = TableManager.GetGemLvlUpConsumeByID(gemItem.DataID);
            if (consumeTab == null)
                continue;
            Debug.Log("gemItem.DataID:" + gemItem.DataID);
            if (consumeTab.ConsumeSubType == _CurGemConsume.ConsumeSubType)
            {
                matCnt += consumeTab.GemMaterialCnt * gemItem.StackCount;
            }
        }
        return matCnt;
    }

    private void TestGem()
    {
        EquipGemLvUpRoot.Instance().SelectGem.Level = _SelectDest.DesLevel;
        UpdateEquip();
    }
    #endregion
}