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

public class CombatValue
{

    public static int CalculateXilian(List<EquipXilianAttr> exAttr, int equipIdx = -1)
    {
        float combatValue = 0;

        var equipScores = TableManager.GetEquipScore();
        var equipAttr = TableManager.GetEquipAttrByID(equipIdx, 0);
        int battleRate = 10000;
        if (equipAttr != null)
        {
            battleRate = equipAttr.BattleRate;
        }
        foreach (var xilianAttr in exAttr)
        {
            if (xilianAttr == null)
                continue;
            foreach (var equipScore in equipScores.Values)
            {
                if (xilianAttr.mPropID == equipScore.PropID)
                {
                    if (equipScore.PropSubID == xilianAttr.PropSubID)
                    {
                        var xilianCombatVar = Mathf.RoundToInt(equipScore.BattleScore * xilianAttr.XilianValue);
                        combatValue += xilianCombatVar;
                    }
                }
            }
        }

        var combatOther = TableManager.GetCombatOtherByID(0, 0);
        if (exAttr.Count > 0)
        {
            combatValue += combatOther.GetCiTiaoCombatbyIndex(exAttr.Count - 1);
        }

        combatValue = (combatValue * battleRate * 0.0001f);

        return Mathf.RoundToInt(combatValue);
    }


    public static int CalculateEquipTotal()
    {
        int combatValue = 0;

        GameItemContainer EquipPack = GameManager.gameManager.PlayerDataPool.EquipPack;
        for (int index = 0; index < EquipPack.ContainerSize; ++index)
        {
            var equipItem = EquipPack.GetItem(index);
            if (equipItem != null && equipItem.IsValid())
            {
                combatValue += CalculateEquipSingle(EquipPack.GetItem(index));
            }
        }

        combatValue += CalculateStrengthSuit();

        return combatValue;
    }

    public static int CalculateMagicXilian(List<EquipXilianAttr> exAttr, int equipIdx = -1)
    {
        int combatValue = 0;

        var equipScores = TableManager.GetEquipScore().Values;
        var equipAttr = TableManager.GetEquipAttrByID(equipIdx, 0);
        int battleRate = 10000;
        if (equipAttr != null)
        {
            battleRate = equipAttr.BattleRate;
        }
        foreach (var xilianAttr in exAttr)
        {
            foreach (var equipScore in equipScores)
            {
                if (xilianAttr.mPropID == equipScore.PropID)
                {
                    if (equipScore.PropSubID == xilianAttr.PropSubID)
                    {
                        var xilianCombatVar = Mathf.RoundToInt(equipScore.MagicCombat * xilianAttr.XilianValue);
                        combatValue += xilianCombatVar;
                    }
                }
            }
        }
        return combatValue;
    }

    public static int CalculateMagicSingle(GameItem equipItem)
    {
        int combatValue = 0;
        combatValue += CalculateMagicBaseAttr(equipItem);
        combatValue += CalculateMagicXilian(equipItem.ExAttrs, equipItem.DataID);

        return combatValue;
    }

    public static int CalculateMagicBaseAttr(GameItem equipItem)
    {
        var equipTab = TableManager.GetMagicWeaponBaseAttrByID(equipItem.DataID, 0);
        if (equipTab == null)
            return 0;
        
        return equipTab.CombatValue;
    }

    public static int CalculateEquipSingle(GameItem equipItem)
    {
        int combatValue = 0;

        combatValue += CalculateBaseAttr(equipItem);
        combatValue += CalculateXilian(equipItem.ExAttrs, equipItem.DataID);
        combatValue += CalculateGemOpen(equipItem);
        combatValue += CalculateFrenzy(equipItem);
        combatValue += CalculateStrength(equipItem);
        combatValue += CalculateGemTotal(equipItem);

        return combatValue;
    }

    public static int CalculateEquipXilianNew(GameItem equipItem)
    {
        int combatValue = 0;

        combatValue += CalculateBaseAttr(equipItem);
        combatValue += CalculateXilian(equipItem.ExAttrsNew, equipItem.DataID);
        combatValue += CalculateGemOpen(equipItem);
        combatValue += CalculateFrenzy(equipItem);
        combatValue += CalculateStrength(equipItem);
        combatValue += CalculateGemTotal(equipItem);

        return combatValue;
    }

    public static int CalculateBaseAttr(GameItem equipItem)
    {
        int combatValue = 0;

        var equipTab = TableManager.GetEquipAttrByID(equipItem.DataID, 0);
        int maxValue = 0;
        float nowValue = 0;
        float kTotal = 0;
        for (int i = 0; i < equipItem.BaseAttrs.Count; ++i)
        {
            nowValue = equipItem.BaseAttrs[i]._OrgValue;
            maxValue = equipTab.GetPropValuebyIndex(i);
            kTotal += nowValue / maxValue;
        }
        float k = kTotal / equipItem.BaseAttrs.Count;
        combatValue = Mathf.RoundToInt(equipTab.CombatValue + k * equipTab.CombatMax);

        return combatValue;
    }

    // 计算狂化对装备战力的影响
    public static int CalculateFrenzy(GameItem equipItem)
    {
        int combatValue = 0;

        if (equipItem.IsFrenzy)
        {
            Tab_CommonItem itemTab = TableManager.GetCommonItemByID(equipItem.DataID, 0);
            var tab = TableManager.GetEquipFrenzy().Values;
            foreach (var kv in tab)
            {
                if ((int)equipItem.GetQuality() == kv.Quality
                    && itemTab.MinLevelRequire >= kv.EquipLevelMin
                    && itemTab.MinLevelRequire <= kv.EquipLevelMax)
                {
                    combatValue = kv.FrenzyCombat;
                    break;
                }
            }
        }

        return combatValue;
    }

    public static int CalculateGemOpen(GameItem equipItem)
    {
        int combatValue = 0;

        int gemOpen = 0;
        foreach (var gemInfo in equipItem.GemItems)
        {
            if (gemInfo.IsOpen)
            {
                ++gemOpen;
            }
        }

        if (gemOpen > 0)
        {
            var combatOther = TableManager.GetCombatOtherByID(0, 0);
            combatValue = combatOther.GetEquipHoleCombatbyIndex(gemOpen - 1);
        }
        return combatValue;
    }

    public static int CalculateStrength(GameItem equipItem)
    {
        int combatValue = 0;

        int strengthPerfect = 0;
        for (int i = 0; i < equipItem.StrengPerfect.Count; ++i)
        {
            strengthPerfect += equipItem.StrengPerfect[i];
        }

        var EquipEnchanceRandRate = TableManager.GetEquipEnchanceRandRateByID(equipItem.EnchanceLevel, 0);
        if (EquipEnchanceRandRate != null)
        {
            combatValue = (int)(strengthPerfect * EquipEnchanceRandRate.EquipEnchanceGrade);
        }

        return combatValue;
    }

    public static int CalculateStrengthSuit()
    {
        int combatValue = 0;

        var suitID = GameManager.gameManager.PlayerDataPool.EquipSuitID;
        if (suitID > 0)
        {
            var equipEnhanceSuit = TableManager.GetEquipEnchanceSuitByID(suitID, 0);
            combatValue = equipEnhanceSuit.CombatValue;
        }

        return combatValue;
    }

    public static int CalculateGemTotal(GameItem equipItem)
    {
        int combatValue = 0;

        int equipPos = equipItem.GetEquipSlotIndex();
        for (int i = 0; i < equipItem.GemItems.Count; ++i)
        {
            var propTab = equipItem.GemItems[i].GetGemPropTab(equipPos);
            if (propTab != null)
            {
                combatValue += propTab.CombatValue;
            }

        }
        
        int combat = 0;
        if (equipItem._GemSuit1 > 0)
        {
            
            var normalSuitTab = TableManager.GetGemSuitByID(equipItem._GemSuit1);
            combat += normalSuitTab.CombatValue;
        }

        if (equipItem._GemSuit2 > 0)
        {
            var eliteSuitTab = TableManager.GetGemSuitByID(equipItem._GemSuit2);
            combat += eliteSuitTab.CombatValue;
        }

        if (equipItem._GemSuit3 > 0)
        {
            var eliteSuitTab = TableManager.GetGemSuitByID(equipItem._GemSuit3);
            combat += eliteSuitTab.CombatValue;
        }
        combatValue += combat;

        return combatValue;
    }
}