using System.Collections.Generic;
using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Common.Combat.FxAILogic;
using Core.Triiger;
using Fort23.Core;
using GameLogic.Combat.CombatTool;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using UnityEngine;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
namespace GameLogic.Combat.Skill.MagicSkill
{
    public class S3401FxMove : CObject
    {
        public Vector3 endPos;
        public FxAILogicBasic fxAILogicBasic;
        public float moveSpeed = 8;
        private System.Action finishCallBack;
        private bool isUpdate;
        private float moveTime;
        public void InitActive(Vector3 endPos, System.Action finishCallBack)
        {
            this.endPos = endPos;
            moveTime = 0;
            this.finishCallBack = finishCallBack;
            isUpdate = true;
        }
        public override void ActiveObj()
        {
        }
        public override void DormancyObj()
        {
            fxAILogicBasic = null;
            isUpdate = false;
        }
        public bool Update(float t)
        {
            if (!isUpdate)
            {
                return false;
            }
            Vector3 pos = fxAILogicBasic.gameObject.transform.position;
            Vector3 dir = endPos - pos;
            float distance = dir.magnitude;
            float addT = 1.0f / (distance / moveSpeed);
            moveTime += t * addT;
            Vector3 d = Vector3.Lerp(pos, endPos, moveTime);
            fxAILogicBasic.gameObject.transform.position = d;
            if (moveTime >= 1)
            {
                fxAILogicBasic.Dispose();
                finishCallBack?.Invoke();
                isUpdate = false;
                CObjectPool.Instance.Recycle(this);
                return false;
            }
            return true;
        }
    }
    /// 
    /// 宝塔在英雄的头顶前往位置旋转,形成一个扇形区域,敌人的功法如果进入这个扇形区域有很大的概率被法宝吸收
    ///(飞到玩家头顶持续施法)
    /// 100%吸收,切吸收后临时增加玩家对于吸收功法的灵根
    /// 
    public class S3401 : MagicSkillBasic, ITriggerEntity
    {
        private List _currTriggerFx = new List();
        private float _currTime;
        private bool _isUpdae;
        private IUnRegister _unRegister;
        protected override void ProMagicUseSkill()
        {
            TimeLineEventLogicGroupBasic timeLineEventLogicGroupBasic = ActivationTimeLineData("sk1_xiaoshi");
            timeLineEventLogicGroupBasic.TimeLineUpdateEnd = delegate()
            {
                Transform root = CombatMagicWeaponEntity.RootMagicWeaponControl.combatHeroEntity.GameObject.transform;
                Vector3 pos = root.TransformPoint(new Vector3(0, 4, 4));
                Quaternion quaternion = Quaternion.Euler(120, 0, 0);
                CombatHeroEntity.GameObject.transform.rotation = root.rotation * quaternion;
                // Vector3 d = root.rotation * _dir;
                CombatHeroEntity.GameObject.transform.position = pos;
                TimeLineEventLogicGroupBasic sk1_show = ActivationTimeLineData("sk1_show");
                sk1_show.TimeLineUpdateEnd = ShowFinish;
            };
        }
        protected void ShowFinish()
        {
            ActivationTimeLineData("sk1");
            SpecialDotInfo specialDotInfo =
                CombatMagicWeaponEntity.GetSpecialDotInfo("sk1");
            _unRegister = specialDotInfo.targetTran.gameObject.OnTriggerEnterEvent(this, OnTriggerExitEvent);
            _isUpdae = true;
        }
        protected override void MagicSkillUpdate(float time)
        {
            for (int i = 0; i < _currTriggerFx.Count; i++)
            {
                S3401FxMove fxMove = _currTriggerFx[i];
                bool isUpdate = fxMove.Update(time);
                if (!isUpdate)
                {
                    _currTriggerFx.RemoveAt(i);
                    i--;
                }
            }
            if (!_isUpdae)
            {
                return;
            }
            _currTime += time;
            if (_currTime > effectValue[1])
            {
                _isUpdae = false;
                SkillPlayFinish();
            }
        }
        protected override void ProSkillPlayFinish()
        {
            _isUpdae = false;
            _unRegister.UnRegister();
            CombatHeroEntity.CloseLoopFx();
        }
        protected override void ProBreakMagicSkill()
        {
            _isUpdae = false;
            SkillPlayFinish();
        }
        private void OnTriggerExitEvent(Collider collider, ITriggerEntity triggerEntity)
        {
            if (triggerEntity == null)
            {
                return;
            }
            FxAILogicBasic fxAILogicBasic = triggerEntity as FxAILogicBasic;
            if (fxAILogicBasic != null && fxAILogicBasic.CombatHeroEntity.IsEnemy != CombatHeroEntity.IsEnemy)
            {
                if (!fxAILogicBasic.isInit)
                {
                    return;
                }
                int odds = CombatCalculateTool.Instance.GetOdd(0, 100);
                if (odds < effectValue[0])
                {
                    fxAILogicBasic.isNotMove = true;
                    S3401FxMove fxMove = CObjectPool.Instance.Fetch();
                    fxMove.fxAILogicBasic = fxAILogicBasic;
                    fxMove.InitActive(CombatHeroEntity.dotPos, null);
                    _currTriggerFx.Add(fxMove);
                }
            }
        }
        public string tag { get; }
    }
}