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


// 是否可进阶判断 ??
public class AdvanceCanadvanceCtr
{
    public static AdvanceCanadvanceCtr Instance;
    public static AdvanceCanadvanceCtr GetInstance()
    {
        if (Instance == null)
            Instance = new AdvanceCanadvanceCtr();
        return Instance;
    }

    public bool IsAdvanceFuncOpen(int type)
    {
        switch (type)
        {
            case (int)AdvanceBase.AdvanceType.Ride:
                if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.RideLevel == 0 || !CheckFuncOpen(8))
                {
                    return false;
                }
                break;
            case (int)AdvanceBase.AdvanceType.Piano:
                if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.GodWeaponLevel == 0 || !CheckFuncOpen(9))
                {
                    return false;
                }
                break;
            case (int)AdvanceBase.AdvanceType.Wing:
                if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.WingLevel == 0 || !CheckFuncOpen(10))
                {
                    return false;
                }
                break;
            case (int)AdvanceBase.AdvanceType.Qilinbi:
                if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.WishLevel == 0 || !CheckFuncOpen(11))
                {
                    return false;
                }
                break;
            case (int)AdvanceBase.AdvanceType.Soul:
                if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.SealLevel == 0 || !CheckFuncOpen(12))
                {
                    return false;
                }
                break;
            case (int)AdvanceBase.AdvanceType.Mask:
                if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.MaskLevel == 0 || !CheckFuncOpen(13))
                {
                    return false;
                }
                break;
            case (int)AdvanceBase.AdvanceType.Huopao:
                if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.CrownLevel == 0 || !CheckFuncOpen(14))
                {
                    return false;
                }
                break;
        }
        return true;
    }

    private bool CheckFuncOpen(int id)
    {
        var table = TableManager.GetFunctionOpenByID(id);
        if (table != null)
        {
            //return table.OpenServerDay <= GlobalData.OpenServerDays && table.OpenVipLv <= GameManager.gameManager.PlayerDataPool.VipCost
            //    && table.OpenLevel <= GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level;
            if (table.OpenServerDay > GlobalData.OpenServerDays)
            {
                var str = StrDictionary.GetClientDictionaryString("#{6450}", table.OpenServerDay, table.Name );
                GUIData.AddNotifyData(str);
                return false;
            }
            if (table.OpenLevel > GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level)
            {
                var str = StrDictionary.GetClientDictionaryString("#{6451}", table.OpenLevel.ToString(), table.Name );
                GUIData.AddNotifyData(str);
                return false;
            }
        }
        return true;
    }

    //判断可以进阶的类型显示对应的Icon 背包更新的时候判断
    public void JudgeShowCanAdvanceIcon()
    {
        if(canAdvanceItemDic.Count == 0)
        {
            GetCanAdvanceitemfunc();  //获取可以用来进阶的物品ID
        }

        GameItemContainer Container = GameManager.gameManager.PlayerDataPool.GetItemContainer(GameItemContainer.Type.TYPE_BACKPACK);
        var itemList = Container.GetList();
        var backPack = GameManager.gameManager.PlayerDataPool.BackPack;
        List<int> needShowCanAdvanceList = new List<int>();
       for (int index = 0; index < itemList.Count; index++)
        {
            GameItem item = itemList[index];
            //根据ID获取道具对应的功能
            if (item.DataID != -1 && canAdvanceItemDic.ContainsKey(item.DataID) && !IsCleanWish(canAdvanceItemDic[item.DataID].advanceType))
            {
                //对应的进阶已经激活
                if (GetAdvanceLevel(canAdvanceItemDic[item.DataID].advanceType) > 0)
                {
                    if (IsItemEnough(canAdvanceItemDic[item.DataID].advanceType))
                    {
                        needShowCanAdvanceList.Add((int)canAdvanceItemDic[item.DataID].advanceType);
                    }
                }
            }
        }

        if (ExtraFunTipRoot.Instance())
        {
            ExtraFunTipRoot.Instance().ShowOrHideTypeIcon(needShowCanAdvanceList);
        }
    }

    private Dictionary<int, AdvanceItemFunc> canAdvanceItemDic = new Dictionary<int, AdvanceItemFunc>();
    public struct AdvanceItemFunc
    {
        public AdvanceBase.AdvanceType advanceType;  //对应的进阶类型
        public bool isClean;
        public AdvanceItemFunc(AdvanceBase.AdvanceType _AdvanceType, bool _isClean)
        {
            advanceType = _AdvanceType;
            isClean = _isClean;
        }
    }

    public bool IsCleanWish(AdvanceBase.AdvanceType type)
    {
        int advanceBaseId = ((int)type + 1) * 1000 + GetAdvanceLevel(type);
        var advanceBase = TableManager.GetAdvanceBaseByID(advanceBaseId, 0);
        if(advanceBase != null)
        {
            return advanceBase.DayDecWishValuePercent > 0 ? true : false;
        }
        return true;
    }
    
    //获取跟进阶有关的Item的信息
    public void GetCanAdvanceitemfunc()
    {
        var baseTabDic = TableManager.GetAdvanceBase();
        foreach(var tab in baseTabDic.Values)
        {
            if(!canAdvanceItemDic.ContainsKey(tab.AdvanceCostItemId) && tab.AdvanceCostItemId != -1)
            {
                AdvanceBase.AdvanceType advanceType = (AdvanceBase.AdvanceType)((tab.Id - tab.Level) / 1000 - 1);
                AdvanceItemFunc func = new AdvanceItemFunc(advanceType, tab.DayDecWishValuePercent > 0 ? true : false);
                canAdvanceItemDic.Add(tab.AdvanceCostItemId, func);
            }
        }
    }

    public bool IsItemEnough(AdvanceBase.AdvanceType type)
    { //是否会被清空 数量是否足够 
        int advanceBaseId = -1;
        if (GetAdvanceLevel(type) != -1)
            advanceBaseId = ((int)type + 1) * 1000 + GetAdvanceLevel(type) + 1;  //消耗判断的是下一个ID的
    Tab_AdvanceBase advanceBase = TableManager.GetAdvanceBaseByID(advanceBaseId, 0);
        if (advanceBase != null)
        {
            int needCostItemId = advanceBase.AdvanceCostItemId;
            return advanceBase.AdvanceCostItemNum <= GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(needCostItemId) ? true : false;
        }
        else
        {
            return false;
        }
    }

    public int GetAdvanceLevel(AdvanceBase.AdvanceType type)
    {
        switch(type)
        {
            case AdvanceBase.AdvanceType.Wing:
                return GameManager.gameManager.PlayerDataPool.m_AdvanceData.WingLevel;
            case AdvanceBase.AdvanceType.Ride:
                return GameManager.gameManager.PlayerDataPool.m_AdvanceData.RideLevel ;
            case AdvanceBase.AdvanceType.Piano:
                return GameManager.gameManager.PlayerDataPool.m_AdvanceData.GodWeaponLevel;
            case AdvanceBase.AdvanceType.Qilinbi:
                return GameManager.gameManager.PlayerDataPool.m_AdvanceData.WishLevel;
            case AdvanceBase.AdvanceType.Soul:
                return GameManager.gameManager.PlayerDataPool.m_AdvanceData.SealLevel;
            case AdvanceBase.AdvanceType.Mask:
                return GameManager.gameManager.PlayerDataPool.m_AdvanceData.MaskLevel;
            case AdvanceBase.AdvanceType.Huopao:
                return GameManager.gameManager.PlayerDataPool.m_AdvanceData.CrownLevel;
            default:
                return -1;
        }
    }
}

public class AdvanceInfo
{
    public int baseId;                      // 对应表ID
    public int type = -1;                   // 进阶类型
    public int level = 0;                   // 等级
    public int wish = 0;                    // 祝福值
    public int SoulDan = 0;                 // 进阶之魂使用数量
    public int SpiritDan = 0;               // 进阶之灵使用数量
    public int combatValue = 0;             // 总战力
    public List<int> skillId;               // 技能id
    public int _RemainAdvanceItemCount;  //剩余进阶道具数量

    public AdvanceInfo() { }
    public AdvanceInfo(int baseId, int type, int level, int wish, int SoulDan, int SpiritDan, int combatValue, List<int> skillList, int remainAdvanceItemCount)
    {
        this.baseId = baseId;
        this.type = type;
        this.level = level;
        this.wish = wish;
        this.SoulDan = SoulDan;
        this.SpiritDan = SpiritDan;
        this.combatValue = combatValue;
        _RemainAdvanceItemCount = remainAdvanceItemCount;
        skillId = new List<int>();
        skillId.AddRange(skillList);
    }

    public void AddSkill(int skillID)
    {
        Tab_AdvanceSkill tab_AdvanceSkill = TableManager.GetAdvanceSkillByID(skillID, 0);
        if (tab_AdvanceSkill == null)
            return;
        for(int i=0;i< skillId.Count;i++)
        {
            Tab_AdvanceSkill tabAdvanceSkill = TableManager.GetAdvanceSkillByID(skillId[i], 0);
            if (tabAdvanceSkill != null && tabAdvanceSkill.Type == tab_AdvanceSkill.Type && tabAdvanceSkill.Index == tab_AdvanceSkill.Index)
            {
                skillId[i] = skillID;
            }
        }
    }

    public void InitSkill(int advanceType)
    {
        if (skillId != null)
            skillId.Clear();
        else
            skillId = new List<int>();

        Dictionary<int, Tab_AdvanceSkill> tab_AdvanceSkills = TableManager.GetAdvanceSkill();
        foreach(var skill in tab_AdvanceSkills)
        {
            if(skill.Value.Type == advanceType && skill.Value.SkillLevel == 0 && GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession == skill.Value.NeedCareer)
            {
                skillId.Add(skill.Key);
            }
        }
    }

}

//进阶返回
public class AdvanceRetInfo
{
    public int type;
    public int level;
    public int wish;
    public bool isCrit;  //是否暴击
    public int incWish; //增长的祝福值,大于0就是成功。
    public int remainAdvanceItemCount;
    public AdvanceRetInfo() { }
    public AdvanceRetInfo(int type, int level, int wish, int isCrit, int incWish, int remainAdvanceItemCount) {
        this.type = type;
        this.level = level;
        this.wish = wish;
        this.isCrit = isCrit == 1 ? true : false;
        this.incWish = incWish;
        this.remainAdvanceItemCount = remainAdvanceItemCount;
    }
}


public class AdvanceBase : MonoBehaviour {

    public static AdvanceBase Instance;
    private void Awake()
    {
        Instance = this;
    }

    private void OnDestroy()
    {
        Instance = null;
    }
    
    protected int m_BaseId;                                     // 当前对应的模型索引ID(用于读取对应的描述,需要自己计算)
    protected int m_level;                                      // 当前对应的等级((进阶类型+1)*1000 + 等级 == curBaseId)
    protected int m_WishValue;                                  // 当前祝福值
    protected int m_InjectionSoulItemUsedCount;                 // 进阶之魂使用的数量
    protected int m_InjectionSpiritualItemUsedCount;            // 进阶之灵使用过的数量
    protected int m_TotalCombatValue;                           // 总战力
    protected int m_AdvanceGrage;                               // 当前进阶等阶
    protected List<int> m_SkillList = new List<int>();

    public List<GameObject> pagePanels;                         // 三个界面预设数组
    public bool hasOpenUI = false;                              // 是否有打开的界面,信息、进阶、幻化的其中一个

    public AdvanceType m_AdvanceType;                           // 当前进阶界面类型
    public AdvanceMenuItemPanelCtr menuItemPanelCtr;            // 右侧菜单栏

    public AdvanceShowPanelCtr showPanel;                       // 信息界面
    public AdvancePanelCtr advancePanel;                        // 进阶界面
    public AdvanceFashionPanelCtr fashionPanel;                 // 幻化界面

    public enum AdvanceType
    {
        Invalid = -1,
        Ride = 0,                  // 坐骑
        Piano = 1,                // 竖琴
        Wing = 2,                // 翅膀
        Qilinbi = 3,             //麒麟臂
        Soul = 4,                 // 魂器
        Mask = 5,               // 面具
        Huopao = 6,          //火炮
    }

    public enum ReqType
    {
        ADVANCE_OPTION = 1,         // 进阶(参数1:goodId不是-1代表自动购买该道具, 参数2:需要购买的数量)
        CHANGE_USEID = 2,           // 幻化(参数1:目标id,进阶的id为等级)
        REQ_INFO = 3,               // 请求进阶信息(参数1:0进阶信息,1时装信息)
        USE_DAN = 4,                // 使用进阶丹(参数1:0进阶之魂,1进阶之灵)
        SKILL_OPTION = 5,           // 学习或升级技能(参数1:目标技能id)
    }

    public enum Advance_req_infotype
    {
        AdvanceInfo = 0,
        FashionInfo = 1,
    }

    // 菜单按钮点击回调
    public void OnMenuItemClick(AdvanceMenuItemPanelCtr.MenuItemOptType type)
    {
        hasOpenUI = true;
        ShowMarkIcon(type);
        CG_REQ_ADVANCE req = (CG_REQ_ADVANCE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_ADVANCE);
        req.SetOptionType((int)ReqType.REQ_INFO);
        req.SetType((int)m_AdvanceType);
        req.SetParam2(-1);
        switch (type)  //请求对应页面的信息
        {
            case AdvanceMenuItemPanelCtr.MenuItemOptType.Show:
            case AdvanceMenuItemPanelCtr.MenuItemOptType.Advance:
                //请求当前进阶信息 
                req.SetParam1((int)Advance_req_infotype.AdvanceInfo);
                break;
            case AdvanceMenuItemPanelCtr.MenuItemOptType.Fashion:
                //请求当前进阶信息 
                req.SetParam1((int)Advance_req_infotype.FashionInfo);
                break;
        }
        req.SendPacket();
    }

    // 激活和目前MenuItem一致的Panel
    public void  ShowMarkIcon(AdvanceMenuItemPanelCtr.MenuItemOptType type)
    {
        for (int index = 0; index < pagePanels.Count; index++)
        {
            pagePanels[index].gameObject.SetActive(index == (int)type ? true : false);
        }

        //显示对应的按钮高亮
        menuItemPanelCtr.ShowMenuItemMaskBG(type);
    }

    // 请求所有进阶数据信息
    public void ReqAllAdvanceInfo()
    {
        CG_REQ_ADVANCE req = (CG_REQ_ADVANCE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_ADVANCE);
        req.SetOptionType((int)AdvanceBase.ReqType.REQ_INFO);
        req.SetType((int)m_AdvanceType);
        req.SetParam2(-1);
        req.SendPacket();
    }

    // 进阶信息
    public AdvanceInfo m_advanceInfo;

    // 接收返回的信息
    public virtual void OnAdvanceInfoReceive(AdvanceInfo packet)
    {
        m_level = packet.level;
        m_WishValue = packet.wish;
        m_InjectionSoulItemUsedCount = packet.SoulDan;
        m_InjectionSpiritualItemUsedCount = packet.SpiritDan;
        m_TotalCombatValue = packet.combatValue;
        m_SkillList = new List<int>();
        m_SkillList.AddRange(packet.skillId);

        // 计算对应的BaseId(进阶类型+1)*1000 + 等级 == curBaseId
        m_BaseId = (packet.type + 1) * 1000 + packet.level;

        // 获取当前进阶的等级
        Tab_AdvanceBase advanceBase = TableManager.GetAdvanceBaseByID(m_BaseId, 0);
        if (advanceBase != null)
        {
            m_AdvanceGrage = advanceBase.Grade;
        }

        m_advanceInfo = new AdvanceInfo(m_BaseId, packet.type, packet.level, packet.wish, packet.SoulDan, packet.SpiritDan, packet.combatValue, packet.skillId, packet._RemainAdvanceItemCount);
        SetCurAdvanceInfo(m_BaseId);
        InitAdvanceInfo();

        UpdateRedPoint();
    }

    private int lastBaseId = -1;                     // 上一次显示的阶级ID

    // 保存当前显示的进阶数据到玩家信息库
    public void SetCurAdvanceInfo(int baseId)
    {
        if(lastBaseId == baseId)
        {
            return;
        }
        lastBaseId = baseId;

        Tab_AdvanceBase advanceBase = TableManager.GetAdvanceBaseByID(baseId, 0);
        if(advanceBase == null)
        {
            return;
        }

        int type = (advanceBase.Id - advanceBase.Level) / 1000 - 1;

        switch(type)
        {
            case (int)AdvanceType.Ride:
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.RideGrade = advanceBase.Grade;
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.RideLevel = advanceBase.Level;
                break;
            case (int)AdvanceType.Wing:
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.WingGrade = advanceBase.Grade;
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.WingLevel = advanceBase.Level;
                break;
            case (int)AdvanceType.Piano:
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.GodWeaponGrade = advanceBase.Grade;
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.GodWeaponLevel = advanceBase.Level;
                break;
            case (int)AdvanceType.Qilinbi:
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.WishGrade = advanceBase.Grade;
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.WishLevel = advanceBase.Level;
                break;
            case (int)AdvanceType.Soul:
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.SealGrade = advanceBase.Grade;
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.SealLevel = advanceBase.Level;
                break;
            case (int)AdvanceType.Mask:
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.MaskGrade = advanceBase.Grade;
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.MaskLevel = advanceBase.Level;
                break;
            case (int)AdvanceType.Huopao:
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.CrownGrade = advanceBase.Grade;
                GameManager.gameManager.PlayerDataPool.m_AdvanceData.CrownLevel = advanceBase.Level;
                break;
        }

        //是否要显示可以进阶的Icon(刷新物品的时候也要显示)
        if (AdvanceCanadvanceCtr.GetInstance() != null)
        {
            AdvanceCanadvanceCtr.GetInstance().JudgeShowCanAdvanceIcon();
        }
    }

    #region 红点更新相关

    public void UpdateRedPoint()
    {
        UpdateShowRedPoint();
        UpdateAdvanceRedPoint();
    }

    public void UpdateShowRedPoint()
    {
        menuItemPanelCtr.UpdateRedPoint(0, showPanel.hasRedPoint());
    }

    public void UpdateAdvanceRedPoint()
    {
        menuItemPanelCtr.UpdateRedPoint(1, advancePanel.hasRedPoint());
    }

    /// <summary>
    /// 更新红点
    /// </summary>
    /// <param name="adType">进阶类型</param>
    public static void UpdateRedPoint(AdvanceType adType)
    {
        if (IsCanActiveRedIcon(adType) && (AdvanceShowPanelCtr.HasRedPoint(adType)
            || AdvancePanelCtr.HasRedPoint(adType)))
        {
            RedTipPoint.SetAdvanceRedTipState(adType, true);
        }
        else
        {
            RedTipPoint.SetAdvanceRedTipState(adType, false);
        }
    }

    public static bool IsCanActiveRedIcon(AdvanceType type)
    {
        var functionOpenId = (int)type + 8; //0 --》 8
        var functionOpenTab = TableManager.GetFunctionOpenByID(functionOpenId, 0);
        if (functionOpenTab == null)
            return false;

        if(functionOpenTab.OpenLevel != 0)
        {
            if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level >= functionOpenTab.OpenLevel
                && (GameManager.gameManager.PlayerDataPool.FunctionOpenState.ContainsKey(functionOpenId)
                    && GameManager.gameManager.PlayerDataPool.FunctionOpenState[functionOpenId]))
            {
                return true;
            }
        }
        else
        {
            if(Guide.Instance._FinishGuideID >= functionOpenTab.ShowGUIDId
                && (GameManager.gameManager.PlayerDataPool.FunctionOpenState.ContainsKey(functionOpenId)
                    && GameManager.gameManager.PlayerDataPool.FunctionOpenState[functionOpenId]))
            {
                return true;
            }
        }

        return false;
    }

    public static void UpdateAllRedPoint()
    {
        for (int i = 0; i <= (int)AdvanceType.Huopao; ++i)
        {
            UpdateRedPoint((AdvanceType)i);
        }

        if (AdvanceMountPanelCtr.Instance && AdvanceMountPanelCtr.Instance.gameObject.activeInHierarchy)
        {
            AdvanceMountPanelCtr.Instance.showPanel.ShowEquipRedIcon();
            AdvanceMountPanelCtr.Instance.showPanel.ShowInjectRedIcon();
            AdvanceMountPanelCtr.Instance.UpdateRedPoint();
        }

    }
    #endregion

    /// <summary>
    /// 初始化进阶界面数据:显示面板以及进阶面板
    /// </summary>
    public void InitAdvanceInfo()
    {
        showPanel.InitShowPanel(m_advanceInfo);
        advancePanel.InitAdvancePanel(m_advanceInfo);
    }

    public void OnDisable()
    {
        hasOpenUI = false;
        UIManager.CloseUI(UIInfo.MoneyInfoPanel);
    }


    // 刷新进阶界面的数据
    public virtual void RefreshAdvancePanel(AdvanceRetInfo info)
    {
        showPanel.RefreshShowInfo(info);
        advancePanel.RefreshAdvancePanelInfo(info);
    }
     
    public virtual void RefreshItemPanel()
    {
        advancePanel.itemPanel.RefreshOwnItemInfo();
    }

    public virtual void RefreshOwnValue()
    {

    }

    public virtual void OnCloseBtnClick() { }
}