using System.Collections.Generic;
using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Common.Combat.FxAILogic;
using Core.Triiger;
using GameLogic.Combat.CombatTool;
using UnityEngine;
namespace GameLogic.Combat.Skill.MagicSkill
{
    /// 
    /// 法宝技能 翡翠葫芦 战场区域形成一个域。敌人的功法弹道进入域后将降低敌人的功法弹道速度
    /// 被影响的功法强度降低20%
    /// 
    public class S3201 : MagicSkillBasic, ITriggerEntity
    {
        private List _fxAILogicBasics = new List();
        private float _currTime;
        private bool _update;
        private IUnRegister _unRegister;
        private IUnRegister _unRegisterExitEvent;
        private CombatHeroEntity target;
        protected Vector3 fxPlayPos;
        protected Vector3 dir;
        private TimeLineEventLogicGroupBasic loopFx;
        // protected Vector3 startEulerAngles;
        protected Quaternion endEulerAngles;
        private SpecialDotInfo specialDotInfo;
        // private List
        protected override void ProMagicUseSkill()
        {
            target=  CombatMagicWeaponEntity.RootMagicWeaponControl.combatHeroEntity.CombatAIBasic.currFocusTarget;
            if (target == null)
            {
                SkillPlayFinish();
                return;
            }
            
            Vector3 rootPos = CombatMagicWeaponEntity.RootMagicWeaponControl.combatHeroEntity.dotPos;
            Vector3 targetPos = target.dotPos;
            dir = (targetPos - rootPos);
            fxPlayPos = dir * 0.5f + rootPos;
            dir = dir.normalized;
            Vector3 newTargetPos = fxPlayPos + new Vector3(1, 5, 0);
            endEulerAngles = Quaternion.LookRotation((fxPlayPos - newTargetPos).normalized) *
                             Quaternion.Euler(new Vector3(80, 0, 0));
            MoveToTargetPosShow magicAttShowBasic = InitMoveToTargetPosShow(newTargetPos, Finish);
            SetMagicAttShowBasic(magicAttShowBasic);
        }
        private void OnTriggerExitEvent(Collider collider, ITriggerEntity triggerEntity)
        {
            if (triggerEntity == null)
            {
                return;
            }
            FxAILogicBasic fxAILogicBasic = triggerEntity as FxAILogicBasic;
            if (fxAILogicBasic != null && fxAILogicBasic.CombatHeroEntity.IsEnemy != CombatHeroEntity.IsEnemy)
            {
                fxAILogicBasic.extraMoveSpeed += SelfSkillConfig.effectValue[0];
                _fxAILogicBasics.Remove(fxAILogicBasic);
            }
        }
        private void OnTriggerEnter(Collider collider, ITriggerEntity triggerEntity)
        {
            if (triggerEntity == null)
            {
                return;
            }
            FxAILogicBasic fxAILogicBasic = triggerEntity as FxAILogicBasic;
            if (fxAILogicBasic != null && fxAILogicBasic.CombatHeroEntity.IsEnemy != CombatHeroEntity.IsEnemy)
            {
                fxAILogicBasic.extraMoveSpeed -= SelfSkillConfig.effectValue[0];
                _fxAILogicBasics.Add(fxAILogicBasic);
                if (SelfSkillConfig.level > 5)
                {
                    SkillFeaturesData skillFeaturesData = fxAILogicBasic.SkillFeaturesData;
                    long v = CombatCalculateTool.Instance.GetVlaueRatioForLong(skillFeaturesData.hp, effectValue[2]);
                    skillFeaturesData.hp -= v;
                }
            }
        }
        protected override void ProBreakMagicSkill()
        {
            AllFinish();
        }
        protected override void MagicSkillUpdate(float time)
        {
            if (_update)
            {
                _currTime += time;
                CombatHeroEntity.GameObject.transform.rotation =
                    Quaternion.Lerp(CombatHeroEntity.GameObject.transform.rotation, endEulerAngles, _currTime * 2);
                specialDotInfo.targetTran.position = fxPlayPos;
                specialDotInfo.targetTran.forward = dir;
                if (_currTime >= SelfSkillConfig.effectValue[1])
                {
                    AllFinish();
                }
            }
        }
        private void AllFinish()
        {
            loopFx.CloseLoopFx();
        
            ActivationTimeLineData("sk1_xiaoshi");
            _unRegister?.UnRegister();
            _unRegisterExitEvent?.UnRegister();
            _unRegisterExitEvent = null;
            _unRegister = null;
            _update = false;
            SkillPlayFinish();
            for (int i = 0; i < _fxAILogicBasics.Count; i++)
            {
                _fxAILogicBasics[i].extraMoveSpeed += SelfSkillConfig.effectValue[0];
            }
            _fxAILogicBasics.Clear();
        }
        private void Finish()
        {
            loopFx = ActivationTimeLineData("sk1", customizePos: new Vector3[] { fxPlayPos });
            // timeLineEventLogicGroupBasic.TimeLineUpdateEnd = () => { };
            specialDotInfo = CombatHeroEntity.GetSpecialDotInfo("lingyu");
            specialDotInfo.targetTran.position = fxPlayPos;
            specialDotInfo.targetTran.forward = dir;
            _unRegister = specialDotInfo.targetTran.gameObject.OnTriggerEnterEvent(this, OnTriggerEnter);
            _currTime = 0;
            _update = true;
            _unRegisterExitEvent = specialDotInfo.targetTran.gameObject.OnTriggerExitEvent(this, OnTriggerExitEvent);
        }
        public string tag { get; }
    }
}