using System.Collections.Generic;
using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Common.Combat.FxAILogic;
using Common.Utility.CombatEvent;
using Fort23.Core;
using GameLogic.Combat.Buff;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Hero;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using UnityEngine;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
namespace GameLogic.Combat.Skill
{
    /// 
    /// 霜域新生(被动,只会生效一次) 凤凰在伤害还剩10%的时候会触发此技能,
    /// 凤凰身体冰冻住并有一层寒气笼罩,期间凤凰不在受到任何伤害,并慢慢回血,
    /// 直到恢复满,持续5秒左右吧,恢复满后凤凰所有灵根增加{0}。冰块爆开,
    /// 生成一个冲击波,对当前场上所有的弹道照成当前强度的强度攻击(强度不够的弹道会被摧毁),生成{1}枚冰锥冲向玩家,对玩家照成{2}伤害
    /// 
    public class S9013 : SkillBasic
    {
        protected BuffBasic BuffBasic;
        private bool isActiveFuHuo;
        private int count;
        private float _currTime;
        protected long addHp;
        protected override void ProActiveSkill()
        {
            count = 0;
            isActiveFuHuo = false;
            CombatEventManager.Instance.AddEventListener(CombatEventType.HeroInjured, HeroInjured);
        }
        private void HeroInjured(IEventData data)
        {
            if (count > 0)
            {
                return;
            }
            HeroInjuredEventData heroInjuredEventData = data as HeroInjuredEventData;
            if (heroInjuredEventData.HarmReturnInfo.target.combatHeroEntity == CombatHeroEntity)
            {
                float bl = CombatHeroEntity.CurrCombatHeroInfo.hp.Value * 1.0f /
                           CombatHeroEntity.MaxCombatHeroInfo.hp.Value;
                if (bl * 100 < effectValue[0])
                {
                    addHp = CombatCalculateTool.Instance.GetVlaueRatioForLong(
                        CombatHeroEntity.MaxCombatHeroInfo.hp.Value, 10);
                    BuffInfo buffInfo = BuffInfo.GetBuffInfo(10151, -1, 1);
                    BuffBasic = CombatHeroEntity.BuffControl.AddBuff(CombatHeroEntity, buffInfo);
                   
                    count++;
                    CombatHeroEntity.CombatHeroSkillControl.This().AddCommandSkill(this);
                    // SpecialDotInfo specialDotInfo = CombatHeroEntity.GetSpecialDotInfo("zdpos2");
                }
            }
        }
        protected override void ProUseSkill()
        {
            _finishTimeLineGroupName = "-1";
            ActivationTimeLineData("9013");
            isActiveFuHuo = true;
        }
        protected override void ProCombatUpdate(float time)
        {
            if (!isActiveFuHuo)
            {
                return;
            }
            _currTime += time;
            if (_currTime > 0.2f)
            {
                _currTime = 0;
                Recover(CombatHeroEntity, CombatHeroEntity.GetMainHotPoin(), addHp, AttType.Skill);
                if (CombatHeroEntity.CurrCombatHeroInfo.hp.Value >= CombatHeroEntity.MaxCombatHeroInfo.hp.Value)
                {
                    CombatHeroEntity.CloseLoopFx();
                    ActivationTimeLineData("9013_hit");
                    isActiveFuHuo = false;
                    float v = effectValue[1];
                    CombatHeroEntity.CurrCombatHeroInfo.Metal += v;
                    CombatHeroEntity.CurrCombatHeroInfo.Wood += v;
                    CombatHeroEntity.CurrCombatHeroInfo.Water += v;
                    CombatHeroEntity.CurrCombatHeroInfo.Fire += v;
                    CombatHeroEntity.CurrCombatHeroInfo.Earth += v;
                    CombatHeroEntity.BuffControl.RemoveBuff(BuffBasic);
                    BuffBasic = null;
                    S9014 s9014 = CombatHeroEntity.CombatHeroSkillControl.GetSkillBasic();
                    if (s9014 != null)
                    {
                        s9014.isActive = true;
                    }
                    ballisticsCount = (int)effectValue[2];
                    for (int i = 0; i < effectValue[2]; i++)
                    {
                        CombatHeroHitPoint combatHeroHitPoint = CombatHeroEntity.CombatAIBasic.currFocusTarget
                            .GetThis()
                            .GetMainHotPoin();
                        BetterList currTarget = new BetterList();
                        currTarget.Add(combatHeroHitPoint);
                        // SpecialDotInfo specialDotInfo = CombatHeroEntity.GetSpecialDotInfo("zdpos" + (i + 2));
                        float x = CombatCalculateTool.Instance.GetOdd(-2, 2);
                        float y = CombatCalculateTool.Instance.GetOdd(1, 3);
                        float z = CombatCalculateTool.Instance.GetOdd(-1, 1);
                        Vector3 pos = CombatHeroEntity.GameObject.transform.TransformPoint(x, y, z);
                        ActivationTimeLineData("9013_suipian", currTarget: currTarget,
                            customizePos: new Vector3[] { pos }, indexCount: i);
                    }
                    List allFxAi =
                        CombatController.currActiveCombat.GameTimeLineParticleFactory.GetFxAILogicBasic(
                            !CombatHeroEntity
                                .IsEnemy);
                    for (int i = 0; i < allFxAi.Count; i++)
                    {
                        SkillFeaturesData mySkillFeaturesData = GetSkillFeaturesData();
                        FxParabolaBulletLogic fxParabolaBulletLogic = allFxAi[i] as FxParabolaBulletLogic;
                        fxParabolaBulletLogic.PengZhuang(mySkillFeaturesData, CombatHeroEntity);
                    }
                    SkillPlayFinish();
                    //完成
                }
            }
        }
        protected void ProDefaultTimeLineTrigger_BaoZa(string groupName, CombatHeroHitPoint targetEntity,
            ITimelineFxLogic timelineFxLogic,
            TriggerData triggerData, ISkillFeatures skillFeatures)
        {
            float harmBl = effectValue[3];
            long v = CombatCalculateTool.Instance.GetVlaueRatioForLong(CombatHeroEntity.CurrCombatHeroInfo.attack.Value,
                harmBl);
            HarmReturnInfo harmReturnInfo = CombatCalculateTool.Instance.Harm(CombatHeroEntity, targetEntity, v,
                AttType.Skill, triggerData,
                wuXingType, skillFeatures,
                HarmType.Default);
        }
    }
}