using Common.Utility.CombatEvent;
using Core.State;
using Fort23.Core;
using GameLogic.Combat.CombatState;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Hero.State;
using GameLogic.Combat.Hero.SubStatus;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using UnityEngine;
namespace GameLogic.Combat.Hero
{
    public class CombatHeroAi : CombatAIBasic
    {
        // public NavMeshObstacle NavMeshObstacle;
        protected CombatHeroEntity _combatHeroEntity
        {
            get { return _showBaiscEntity as CombatHeroEntity; }
        }
        protected float _r = 5;
        public bool isAlert;
        /// 
        /// 当前聚焦的目标
        /// 
        public override CombatHeroEntity currFocusTarget
        {
            get { return _currFocusTarget; }
            set
            {
                if (value == _currFocusTarget)
                {
                    return;
                }
                CombatHeroTargetAlterEventData combatHeroTargetAlterEventData = CombatHeroTargetAlterEventData.Create();
                combatHeroTargetAlterEventData.combatHeroEntity = _combatHeroEntity;
                combatHeroTargetAlterEventData.targetCombatHeroEntity = value;
                combatHeroTargetAlterEventData.lasetCombatHeroEntity = _currFocusTarget;
                CombatEventManager.Instance.Dispatch(CombatEventType.TargetAlter, combatHeroTargetAlterEventData);
                _currFocusTarget = value;
            }
        }
        private BetterList _areaList = new BetterList();
        private BetterList _HindAreaList = new BetterList();
        private float _t;
        public GameObject[] AreaList
        {
            get { return _areaList.ToArray(); }
        }
        protected override void ProInit()
        {
            CombatEventManager.Instance.AddEventListener(CombatEventType.AlertTrigger, AlertTrigger);
        }
        protected void AlertTrigger(IEventData iEventData)
        {
            AlertTriggerEventData alertTriggerEventData = iEventData as AlertTriggerEventData;
            if (alertTriggerEventData.combatHeroEntity == _combatHeroEntity)
            {
                if (alertTriggerEventData.isTrigger && !_areaList.Contains(alertTriggerEventData.triggerObject))
                {
                    _areaList.Add(alertTriggerEventData.triggerObject);
                }
                else if (!alertTriggerEventData.isTrigger)
                {
                    _areaList.Remove(alertTriggerEventData.triggerObject);
                    _HindAreaList.Remove(alertTriggerEventData.triggerObject);
                }
            }
        }
        protected override void ProInitState()
        {
            stateControl.AddState(CombatHeroStateType.idle, new CombatHeroIdleState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.move, new CombatHeroMoveState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.att, new CombatHeroAttState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.dile, new CombatHeroDieState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.rolling, new CombatHeroRollingState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.followMove, new CombatHeroFollowMoveState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.followIdle, new CombatHeroFollowIdleState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.NullState, new CombatHeroNullState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.Active, new CombatHeroActiveState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.XiuMian, new CombatHeroXiuMianState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.Resurrection, new CombatResurrectionState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.PickUp, new CombatHeroPickUpState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.Flight, new CombatHeroFlightState(_combatHeroEntity));
            stateControl.AddState(CombatHeroStateType.Disappear, new CombatHeroDisappearState(_combatHeroEntity));
        }
        public override void Update(float t)
        {
            if (CombatController.currActiveCombat.isStopAi)
            {
                if (stateControl.CurrStateName.Equals(CombatHeroStateType.move))
                {
                    stateControl.ChangeState(CombatHeroStateType.idle);
                }
                return;
            }
            for (int i = 0; i < _areaList.Count; i++)
            {
                if (!_areaList[i].activeSelf)
                {
                    _HindAreaList.Remove(_areaList[i]);
                    _areaList.RemoveAt(i);
                    i--;
                }
            }
            for (int i = 0; i < _subStatusList.Count; i++)
            {
                SubStatusBasic subStatusBasic = _subStatusList[i];
                string s = subStatusBasic.IsGetStateName();
                if (!string.IsNullOrEmpty(s))
                {
                    stateControl.ChangeState(s);
                }
                _subStatusList[i].Update(t);
            }
            if (CombatController.currActiveCombat.IsFightState)
            {
                if (currFocusTarget == null || currFocusTarget.isDie ||
                    (currFocusTarget is BannerHero && !_combatHeroEntity.IsEnemy))
                {
                    CombatHeroEntity[] allHero =
                        CombatController.currActiveCombat.CombatHeroController.GetHero(!_combatHeroEntity.IsEnemy);
                    IHero minDistanceHero = FindMinDixtance(allHero);
                    currFocusTarget = minDistanceHero as CombatHeroEntity;
                    if (!_combatHeroEntity.IsEnemy && currFocusTarget == null)
                    {
                        currFocusTarget = CombatController.currActiveCombat.CombatTypeBasic.currBannerHero;
                    }
                }
            }
            else
            {
                currFocusTarget = null;
            }
            stateControl.Update(t);
            if (currFocusTarget != null && CurrState != null && CurrState.IsUpdateLockTarget() &&
                !_combatHeroEntity.isDie && !isAlert)
            {
                Vector3 nextPos = currFocusTarget.dotPos;
                Vector3 p = nextPos - _combatHeroEntity.dotPos;
                if (p.sqrMagnitude > 0.00001)
                {
                    _combatHeroEntity.combatHeroGameObject.rotation = Quaternion.Lerp(
                        _combatHeroEntity.combatHeroGameObject.rotation, Quaternion.LookRotation(p.normalized),
                        0.5f);
                }
            }
            ProUpdate();
            if (currFocusTarget != null)
            {
                _combatHeroEntity.GameObject.transform.rotation =
                    Quaternion.LookRotation(currFocusTarget.dotPos - _combatHeroEntity.dotPos);
            }
        }
        protected IHero FindMinDixtance(CombatHeroEntity[] allHero)
        {
            IHero minDistanceHero = null;
            if (allHero == null)
            {
                return null;
            }
            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 -
                                                      _combatHeroEntity.combatHeroGameObject.position);
                if (distance < minDistance)
                {
                    // if (!_combatHeroEntity.IsEnemy || distance < _combatHeroEntity.CurrCombatHeroInfo.maxDisTo + 100)
                    {
                        minDistance = distance;
                        minDistanceHero = hero;
                    }
                }
            }
            return minDistanceHero;
        }
        protected override void ProDispose()
        {
            CombatEventManager.Instance.RemoveEventListener(CombatEventType.AlertTrigger, AlertTrigger);
        }
    }
}