using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Fort23.Core;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.CombatType;
using GameLogic.Combat.Hero;
using UnityEngine;
namespace GameLogic.Combat.CombatState
{
    public class CombatUpdateState : CombatStateBasic
    {
        /// 
        /// 下次遇见怪的时间
        /// 
        private float _nextMonsterTime;
        
        /// 
        /// 是否没有敌人
        /// 
        protected bool isNullMonster;
      
        public CombatUpdateState(CombatController combatController) : base(combatController)
        {
        }
        protected override void ProEnter()
        {
            CombatController.CombatCameraControllder.isStop = false;
            CombatController.IsFightState = false;
            CombatController.GameTimeLineParticleFactory.RecycleAllFxAiLogicBasic();
            CombatHeroEntity playerHeroEntity = CombatController.currActiveCombat.playerHeroEntity;
            if (playerHeroEntity != null)
            {
                playerHeroEntity.CombatAIBasic.ChangeState(CombatHeroStateType.Flight);
                playerHeroEntity.CurrCombatHeroInfo.Shield = playerHeroEntity.MaxCombatHeroInfo.Shield;
                CombatCalculateTool.Instance.Recover(playerHeroEntity,
                    playerHeroEntity.GetMainHotPoin(), 999999, AttType.Normal, HarmType.Default,
                    new TriggerData());
            }
            _nextMonsterTime = Random.Range(5, 10);
            isNullMonster = true;
            CombatController.MagicWeaponCombatSence.CloseSecene();
            CombatController.currActiveCombat.CombatCameraControllder.SetFieldOfView(80,1);
        }
        protected override void ProUpdate(float t)
        {
            CombatHeroEntity playerHeroEntity = CombatController.currActiveCombat.playerHeroEntity;
            if (playerHeroEntity == null)
            {
                return;
            }
            if (isNullMonster)
            {
                _nextMonsterTime -= t;
            
                if (_nextMonsterTime < 0)
                {   _nextMonsterTime = Random.Range(5, 10);
                   // EventSystemManager.Instance.DetectRandomEvents();
                   EventManager.Instance.Dispatch(CustomEventType.DetectRandomEvent,null);
                }
            }
            CombatHeroEntity[] allHero =
                CombatController.currActiveCombat.CombatHeroController.GetHero(true);
            IHero ihero = FindMinDixtance(allHero);
            if (ihero != null)
            {
                CombatController.ChangeState("fight");
                return;
            }
            float add = 0.1f;
            Vector3 pos = Vector3.zero;
            Vector3 dir = Vector3.zero;
            float fx = 1;
            pos = CombatController.currActiveCombat.CombatSenceController.Move(10 * t);
            float lt = CombatController.currActiveCombat.CombatSenceController.currTime - 0.01f;
            Vector3 p = CombatController.currActiveCombat.CombatSenceController.GetTarget(lt);
            dir = (pos - p).normalized;
            playerHeroEntity.combatHeroGameObject.SetPosition(pos);
            playerHeroEntity.GameObject.transform.rotation = Quaternion.LookRotation(dir * fx);
            CombatController.CombatHeroController.Update(t);
            CombatController.CombatCameraControllder.Update(t);
            CombatController.GameTimeLineParticleFactory.CombatUpdate(t);
        }
        protected IHero FindMinDixtance(CombatHeroEntity[] allHero)
        {
            IHero minDistanceHero = null;
            if (allHero == null)
            {
                return null;
            }
            CombatHeroEntity playerHeroEntity = CombatController.currActiveCombat.playerHeroEntity;
            float minDistance = float.MaxValue;
            for (int i = 0; i < allHero.Length; i++)
            {
                CombatHeroEntity hero = allHero[i];
                if (hero.GetMainHotPoin() == null)
                {
                    continue;
                }
                float distance = Vector3.SqrMagnitude(hero.combatHeroGameObject.position -
                                                      playerHeroEntity.combatHeroGameObject.position);
                if (distance < minDistance && distance < 225)
                {
                    // if (!_combatHeroEntity.IsEnemy || distance < _combatHeroEntity.CurrCombatHeroInfo.maxDisTo + 100)
                    {
                        minDistance = distance;
                        minDistanceHero = hero;
                    }
                }
            }
            return minDistanceHero;
        }
    }
}