using System.Collections;
using System.Collections.Generic;
using Core.Language;
using Core.Utility;
using Excel2Json;
using Fort23.UTool;
using GameLogic.Combat.CombatTool;
using GameLogic.Hero;
using GameLogic.Player;
using UnityEngine;
using UnityEngine.Serialization;
using Utility;
[System.Serializable]
public class CombatHeroInfo
{
    public enum AttributeType
    {
        Hp,
        Att,
        Def,
    }
    public int modelID;
    public EncryptionLong hp = new EncryptionLong();
    public EncryptionLong defense = new EncryptionLong();
    public EncryptionLong attack = new EncryptionLong();
    // public long 
    public EncryptionFloat attSpeed
    {
        get { return _attSpeed; }
    }
    public EncryptionInt level;
    public EncryptionInt exp = new EncryptionInt();
    public HeroModelConfig modelConfig;
    public HeroPowerUpConfig powerUpConfig;
    public MonsterPowerUpConfig MonsterPowerUpConfig;
    public EncryptionFloat _attSpeed;
    /// 
    /// 功法强度的加成 %
    /// 
    public float gongFaStrength;
    /// 
    /// 护盾
    /// 
    public EncryptionLong Shield;
    /// 
    /// 神识
    /// 
    public EncryptionLong shenshi;
    /// 
    /// 添加的攻击速度比例%
    /// 
    public float addAttSpeed_bl;
    /// 
    /// 金
    /// 
    public float Metal = 100;
    /// 
    /// 木
    /// 
    public float Wood = 100;
    /// 
    /// 水
    /// 
    public float Water = 100;
    /// 
    /// 火
    /// 
    public float Fire = 100;
    /// 
    /// 土
    /// 
    public float Earth = 100;
    /// 
    /// 金
    /// 
    public float Metal_Injury;
    /// 
    /// 木
    /// 
    public float Wood_Injury;
    /// 
    /// 水
    /// 
    public float Water_Injury;
    /// 
    /// 火
    /// 
    public float Fire_Injury;
    /// 
    /// 土
    /// 
    public float Earth_Injury;
    /// 
    /// 火精通
    /// 
    public float Fire_Proficient;
    /// 
    /// 土精通
    /// 
    public float Earth_Proficient;
    /// 
    /// 水精通
    /// 
    public float Water_Proficient;
    /// 
    /// 毒精通
    /// 
    public float Wood_Proficient;
    /// 
    /// 流行精通
    /// 
    public float Metal_Proficient;
    /// 
    /// 异常伤害增加
    /// 
    public float abnormalHarmAdd;
    /// 
    /// 金伤害增加
    /// 
    public float Metal_HarmAdd;
    /// 
    /// 火伤害增加
    /// 
    public float Fire_HarmAdd;
    /// 
    /// 土伤害增加
    /// 
    public float Earth_HarmAdd;
    /// 
    /// 水伤害增加
    /// 
    public float Water_HarmAdd;
    /// 
    /// 木伤害增加
    /// 
    public float Wood_HarmAdd;
    /// 
    /// 最后伤害减少
    /// 
    public float finallyHarmReduce;
    /// 
    /// 最终伤害增加 buff伤害除外
    /// 
    public float finallyHarmAdd;
    /// 
    /// 1=英雄 2=小怪 3=精英怪 4=boss
    /// 
    public int heroType;
    public string modelName;
    public bool isMonster;
    public int k;
    // public int[] skillId;
    // public List skillConfigs;
    /// 
    /// 所有已解锁技能的ID
    /// 
    public List unLockSkills = new List();
    public bool isGpu;
    public string heroName;
    public List MagicWeaponID = new List();
    /// 
    /// 大道修炼ID
    /// 
    public int TaoismSkillId;
   
    public float GetAttSpeed
    {
        get
        {
            float speed = CombatCalculateTool.Instance.GetVlaueRatioForFloat(attSpeed.Value,
                addAttSpeed_bl + 100);
            if (speed < 0)
            {
                speed = 0.01f;
            }
            return speed;
        }
    }
    public float GetAnimationSpeed
    {
        get { return GetAttSpeed / _attSpeed.Value; }
    }
    public CombatHeroInfo()
    {
    }
    protected Map _AttributeCacheValue = new Map();
    /// 
    /// 获取五行灵根属性
    /// 
    /// 
    /// 
    public float GetWuXingShuXing(WuXingType wuXingType)
    {
        switch (wuXingType)
        {
            case WuXingType.Gold:
                float Metal_v = Metal - Metal_Injury;
                if (Metal_v < 0)
                {
                    Metal_v = 0;
                }
                return Metal_v;
                break;
            case WuXingType.Wood:
                float Wood_v = Wood - Wood_Injury;
                if (Wood_v < 0)
                {
                    Wood_v = 0;
                }
                return Wood_v;
                break;
            case WuXingType.Water:
                float Water_v = Water - Water_Injury;
                if (Water_v < 0)
                {
                    Water_v = 0;
                }
                return Water_v;
                break;
            case WuXingType.Fire:
                float Fire_v = Fire - Fire_Injury;
                if (Fire_v < 0)
                {
                    Fire_v = 0;
                }
                return Fire_v;
                break;
            case WuXingType.Earth:
                float Earth_v = Earth - Earth_Injury;
                if (Earth_v < 0)
                {
                    Earth_v = 0;
                }
                return Earth_v;
                break;
            default:
                return 100;
                return 0;
        }
    }
    protected void CalBasicAttribute()
    {
        _AttributeCacheValue.Clear();
        modelID = modelConfig.ID;
        if (isMonster)
        {
            unLockSkills.Clear();
            hp = (EncryptionLong)(modelConfig.hp * MonsterPowerUpConfig.HPFactor);
            defense = (EncryptionLong)(modelConfig.def * MonsterPowerUpConfig.DEFFactor);
            attack = (EncryptionLong)(modelConfig.attack * MonsterPowerUpConfig.ATKFactor);
            k = MonsterPowerUpConfig.defK;
            Metal = modelConfig.Linggen[0] * MonsterPowerUpConfig.LinggenUp / 100;
            Water = modelConfig.Linggen[1] * MonsterPowerUpConfig.LinggenUp / 100;
            Wood = modelConfig.Linggen[2] * MonsterPowerUpConfig.LinggenUp / 100;
            Fire = modelConfig.Linggen[3] * MonsterPowerUpConfig.LinggenUp / 100;
            Earth = modelConfig.Linggen[4] * MonsterPowerUpConfig.LinggenUp / 100;
            Shield = (EncryptionLong)(modelConfig.shield * MonsterPowerUpConfig.HudunFactor);
            SetSkillAttSpeed(modelConfig.speed_atk);
            if (modelConfig.skillID != null)
            {
                for (int i = 0; i < modelConfig.skillID.Length; i++)
                {
                    int id = modelConfig.skillID[i];
                    if (id <= 0)
                    {
                        continue;
                    }
                    int startLevel = modelConfig.skillActiveLv[i];
                    if (startLevel > 0 && level < startLevel)
                    {
                        continue;
                    }
                    SkillInfo skillInfo =
                        new SkillInfo(id, MonsterPowerUpConfig.GongfaLv, MonsterPowerUpConfig.GongfaStar);
                    skillInfo.index = i;
                    unLockSkills.Add(skillInfo);
                }
            }
            if (modelConfig.fa_bao_id != null)
            {
                for (int i = 0; i < modelConfig.fa_bao_id.Length; i++)
                {
                    int faBaoId = modelConfig.fa_bao_id[i];
                    int startLevel = modelConfig.fabaoActiveLv[i];
                    if (startLevel > 0 && level < startLevel)
                    {
                        continue;
                    }
                    if (faBaoId > 0)
                    {
                        FaBaoInfo faBaoInfo = new FaBaoInfo(faBaoId, MonsterPowerUpConfig.FabaoLv,
                            MonsterPowerUpConfig.FabaoStar);
                        MagicWeaponID.Add(faBaoInfo);
                    }
                }
            }
        }
        else
        {
            hp = (EncryptionLong)(modelConfig.hp * powerUpConfig.HPFactor);
            defense = (EncryptionLong)(modelConfig.def * powerUpConfig.DEFFactor);
            attack = (EncryptionLong)(modelConfig.attack * powerUpConfig.ATKFactor);
            Shield = (EncryptionLong)(modelConfig.shield * powerUpConfig.HudunFactor);
            // shenshi = (EncryptionLong)(modelConfig.shenshi * powerUpConfig.ShenshiFactor);
            k = powerUpConfig.defK;
        }
        for (_AttributeCacheValue.Begin(); _AttributeCacheValue.Next();)
        {
            switch (_AttributeCacheValue.Key)
            {
                case AttributeType.Hp:
                    hp += CombatCalculateTool.Instance.GetVlaueRatioForLong(hp.Value, _AttributeCacheValue.Value);
                    break;
                case AttributeType.Att:
                    attack += CombatCalculateTool.Instance.GetVlaueRatioForLong(attack.Value,
                        _AttributeCacheValue.Value);
                    break;
                case AttributeType.Def:
                    defense += CombatCalculateTool.Instance.GetVlaueRatioForLong(defense.Value,
                        _AttributeCacheValue.Value);
                    break;
            }
        }
        if (!isMonster)
        {
            for (int i = 0; i < MagicWeaponID.Count; i++)
            {
                FaBaoInfo faBaoInfo = MagicWeaponID[i];
                foreach (var VARIABLE in faBaoInfo.attriButedIC)
                {
                    switch (VARIABLE.Key)
                    {
                        case 1:
                            hp += VARIABLE.Value;
                            break;
                        case 2:
                            defense += VARIABLE.Value;
                            break;
                        case 3:
                            attack += VARIABLE.Value;
                            break;
                    }
                }
            }
        }
    }
    public SkillConfig GetGroupSkillConfig(int idGroup)
    {
        if (unLockSkills == null)
        {
            return default;
        }
        for (int i = 0; i < unLockSkills.Count; i++)
        {
            // SkillConfig skillConfig = ConfigComponent.Instance.Get(unLockSkills[i]);
            if (unLockSkills[i].skillConfig.IDGroup == idGroup)
            {
                return unLockSkills[i].skillConfig;
            }
        }
        return default;
    }
    protected void CalAttribute()
    {
        CalBasicAttribute();
        // skillId = modelConfig.skillID;
        modelName = modelConfig.model;
        isGpu = modelConfig.isUseGpu;
        heroType = modelConfig.heroType;
    }
    public void SetSkillAttSpeed(float attSpeed)
    {
        _attSpeed = (EncryptionFloat)(1.0f / attSpeed);
    }
    protected void SetDataConfig(int modelID, int level)
    {
        modelConfig = ConfigComponent.Instance.Get(modelID);
        if (isMonster)
        {
            MonsterPowerUpConfig = ConfigComponent.Instance.Get(level);
        }
        else
        {
            powerUpConfig = ConfigComponent.Instance.Get(level);
        }
        this.level = (EncryptionInt)level;
        heroName = LanguageManager.Instance.Text(modelConfig.name);
    }
    public void InitMonster(int modelID, int level)
    {
        isMonster = true;
        SetDataConfig(modelID, level);
        CalAttribute();
    }
    public CombatHeroInfo Copy()
    {
        CombatHeroInfo combatHeroInfo = (CombatHeroInfo)MemberwiseClone();
        return combatHeroInfo;
    }
}