using Common.Utility.CombatEvent;
using Fort23.Core;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Hero;
using GameLogic.Player;
using Utility;
namespace GameLogic.Combat.Skill
{
    /// 
    /// 生衍道 :功法拥有生息之能,每次使用功法能获得对应属性的充能,充能满后获得对应属性的加成 金:提升攻击力 木:恢复生命 水:治疗一个较重伤势 火:功法强度提升 土:玩家防御提升。(全能型)
    /// 
    public class DS60102 : SkillBasic
    {
        public Map currEnergy = new Map();
        private long addAtt;
        private float addAtt_bl;
        private long addDef;
        private float addDef_bl;
        private long addQiangDu;
        private float addQiangDu_bl;
        protected override void ProUseSkill()
        {
        }
        protected override void ProInitSkill()
        {
            CombatEventManager.Instance.AddEventListener(CombatEventType.UseSkill, UseSkill);
        }
        private void UseSkill(IEventData iEventData)
        {
            CombatUseSkillEventData combatUseSkillEventData = iEventData as CombatUseSkillEventData;
            SkillBasic skillBasic = combatUseSkillEventData.useSkill;
            if (skillBasic.CombatHeroEntity == CombatHeroEntity && skillBasic.SelfSkillConfig.SkillType == 1)
            {
                float v = SelfSkillConfig.effectValue[0];
                if (currEnergy.ContainsKey(skillBasic.wuXingType))
                {
                    currEnergy[skillBasic.wuXingType] += v;
                    v = currEnergy[skillBasic.wuXingType];
                }
                else
                {
                    currEnergy.Add(skillBasic.wuXingType, v);
                }
                switch (skillBasic.wuXingType)
                {
                    case WuXingType.Gold:
                        GoldLogic();
                        break;
                    case WuXingType.Wood:
                        WoodLogic();
                        break;
                    case WuXingType.Water:
                        WaterLogic();
                        break;
                    case WuXingType.Fire:
                        FireLogic();
                        break;
                    case WuXingType.Earth:
                        EarthLogic();
                        break;
                }
            }
        }
        protected void GoldLogic()
        {
            float max = SelfSkillConfig.effectValue[1];
            float v = currEnergy[WuXingType.Gold];
            if (v >= max)
            {
                currEnergy[WuXingType.Gold] = 0;
                long maxAttack = CombatHeroEntity.MaxCombatHeroInfo.attack.Value;
                float addV = SelfSkillConfig.effectValue[2];
                float maxValue = SelfSkillConfig.effectValue[3];
                if (addV + addAtt_bl > maxValue)
                {
                    addV = maxValue - addAtt_bl;
                }
                addAtt_bl += addV;
                CombatHeroEntity.CurrCombatHeroInfo.attack -= addAtt;
                addAtt = CombatCalculateTool.Instance.GetVlaueRatioForLong(maxAttack, addV);
                CombatHeroEntity.CurrCombatHeroInfo.attack += addAtt;
            }
        }
        protected void WoodLogic()
        {
            float max = SelfSkillConfig.effectValue[4];
            float v = currEnergy[WuXingType.Wood];
            if (v >= max)
            {
                currEnergy[WuXingType.Wood] = 0;
                long h = CombatCalculateTool.Instance.GetVlaueRatioForLong(CombatHeroEntity.MaxCombatHeroInfo.hp.Value,
                    SelfSkillConfig.effectValue[5]);
                CombatCalculateTool.Instance.Recover(CombatHeroEntity,
                    CombatHeroEntity.GetMainHotPoin(), h, AttType.Skill, HarmType.Default,
                    triggerData);
            }
        }
        protected void WaterLogic()
        {
            float max = SelfSkillConfig.effectValue[6];
            float v = currEnergy[WuXingType.Water];
            if (v < max)
            {
                return;
            }
            currEnergy[WuXingType.Water] = 0;
            float metal_Injury = CombatHeroEntity.CurrCombatHeroInfo.Metal_Injury;
            float Wood_Injury = CombatHeroEntity.CurrCombatHeroInfo.Wood_Injury;
            float Water_Injury = CombatHeroEntity.CurrCombatHeroInfo.Water_Injury;
            float Fire_Injury = CombatHeroEntity.CurrCombatHeroInfo.Fire_Injury;
            float Earth_Injury = CombatHeroEntity.CurrCombatHeroInfo.Earth_Injury;
            float[] injury = { metal_Injury, Wood_Injury, Water_Injury, Fire_Injury, Earth_Injury };
            int minIndex = 0;
            float minValue = injury[0];
            for (int i = 1; i < injury.Length; i++)
            {
                if (injury[i] < minValue)
                {
                    minValue = injury[i];
                    minIndex = i;
                }
            }
            float vInjury = SelfSkillConfig.effectValue[7];
            switch (minIndex)
            {
                case 0:
                    CombatHeroEntity.CurrCombatHeroInfo.Metal_Injury -= vInjury;
                    break;
                case 1:
                    CombatHeroEntity.CurrCombatHeroInfo.Wood_Injury -= vInjury;
                    break;
                case 2:
                    CombatHeroEntity.CurrCombatHeroInfo.Water_Injury -= vInjury;
                    break;
                case 3:
                    CombatHeroEntity.CurrCombatHeroInfo.Fire_Injury -= vInjury;
                    break;
                case 4:
                    CombatHeroEntity.CurrCombatHeroInfo.Earth_Injury -= vInjury;
                    break;
            }
        }
        protected void FireLogic()
        {
            float max = SelfSkillConfig.effectValue[8];
            float v = currEnergy[WuXingType.Fire];
            if (v < max)
            {
                return;
            }
            currEnergy[WuXingType.Fire] = 0;
            // float currGongFaStrength = CombatHeroEntity.CurrCombatHeroInfo.gongFaStrength;
            float addV = SelfSkillConfig.effectValue[9];
            float maxValue = SelfSkillConfig.effectValue[10];
            if (addV + addQiangDu_bl > maxValue)
            {
                addV = maxValue - addQiangDu_bl;
            }
            CombatHeroEntity.CurrCombatHeroInfo.gongFaStrength -= addQiangDu_bl;
            addQiangDu_bl += addV;
            CombatHeroEntity.CurrCombatHeroInfo.gongFaStrength += addQiangDu_bl;
        }
        protected void EarthLogic()
        {
            float max = SelfSkillConfig.effectValue[11];
            float v = currEnergy[WuXingType.Earth];
            if (v < max)
            {
                return;
            }
            currEnergy[WuXingType.Earth] = 0;
            long maxDef = CombatHeroEntity.MaxCombatHeroInfo.defense.Value;
            float addV = SelfSkillConfig.effectValue[12];
            float maxValue = SelfSkillConfig.effectValue[13];
            if (addV + addDef_bl > maxValue)
            {
                addV = maxValue - addDef_bl;
            }
            addDef_bl += addV;
            CombatHeroEntity.CurrCombatHeroInfo.defense -= addDef;
            addDef = CombatCalculateTool.Instance.GetVlaueRatioForLong(maxDef, addV);
            CombatHeroEntity.CurrCombatHeroInfo.attack += addDef;
        }
        private void Finish()
        {
            // if (_updateTime)
            // {
            //     CombatHeroEntity.CurrCombatHeroInfo.addAttSpeed_bl -= SelfSkillConfig.effectValue[2];
            //     _updateTime = false;
            // }
        }
        protected override void ProCombatUpdate(float time)
        {
            // if (_updateTime)
            // {
            //     _currTime += time;
            //     if (_currTime >= SelfSkillConfig.effectValue[3])
            //     {
            //         Finish();
            //     }
            // }
        }
        protected override void ProDispose()
        {
            CombatEventManager.Instance.RemoveEventListener(CombatEventType.UseSkill, UseSkill);
        }
    }
}