using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Core.Audio;
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,isQiangZhi:true);
                playerHeroEntity.CurrCombatHeroInfo.Shield = playerHeroEntity.MaxCombatHeroInfo.Shield;
                CombatCalculateTool.Instance.Recover(playerHeroEntity,
                    playerHeroEntity.GetMainHotPoin(), 999999, AttType.Normal, HarmType.Null,
                    new TriggerData());
            }
            _nextMonsterTime = Random.Range(5, 10);
            isNullMonster = true;
            CombatController.MagicWeaponCombatSence.CloseSecene();
            CombatController.currActiveCombat.CombatCameraControllder.SetFieldOfView(70,1);
            AudioManager.Instance.PlayBGM("xunlongduobao.wav");
        }
        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(PlayerManager.Instance.gameConstantConfig.GuajiCD[0], PlayerManager.Instance.gameConstantConfig.GuajiCD[1]);
                   // EventSystemManager.Instance.DetectRandomEvents();
                   EventManager.Instance.Dispatch(CustomEventType.DetectRandomEvent,null);
                }
            }
            CombatHeroEntity[] allHero =
                CombatController.currActiveCombat.CombatHeroController.GetHero(true,out int maxCount);
            if (maxCount > 0)
            {
                // CombatController.ChangeState("fight");
                return;
            }
            
            float add = 0.1f;
            Vector3 pos = playerHeroEntity.dotPos;
            Vector3 dir =  CombatController.currActiveCombat.CombatSenceController.moveDir;
            float fx = 1;
            
            pos += dir.normalized * CombatController.currActiveCombat.CombatHeroController.moveSpeed * t;
            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,int maxCount)
        {
            IHero minDistanceHero = null;
            if (allHero == null)
            {
                return null;
            }
            CombatHeroEntity playerHeroEntity = CombatController.currActiveCombat.playerHeroEntity;
            float minDistance = float.MaxValue;
            for (int i = 0; i < maxCount; 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;
        }
    }
}