using System.Collections.Generic;
using Common.Utility.CombatEvent;
using Fort23.Core;
using GameLogic.Combat.Hero;
using GameLogic.Combat.Hero.State;
using UnityEngine;
using Utility;
namespace GameLogic.Combat.CombatTool
{
    /// 
    /// 法宝战斗场景
    /// 
    public class MagicWeaponCombatSence
    {
        private BetterList _enemyMagicWeaponList = new BetterList();
        private BetterList _playerMagicWeaponList = new BetterList();
        /// 
        /// 战斗包围盒 minX miny maxx maxy
        /// 
        public Vector4 combatBox;
        /// 
        /// 我方法宝入场点
        /// 
        public Vector3 myEnterCombatPos;
        /// 
        /// 地方法宝入场点
        /// 
        public Vector3 enemyEnterCombatPos;
        private Map magicWeaponCollisionInfoList =
            new Map();
        private int MagicWeaponCollisionID;
        public void CloseSecene()
        {
            magicWeaponCollisionInfoList.Clear();
            for (int i = 0; i < _enemyMagicWeaponList.Count; i++)
            {
                _enemyMagicWeaponList[i].CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian);
            }
            for (int i = 0; i < _playerMagicWeaponList.Count; i++)
            {
                _playerMagicWeaponList[i].CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian);
            }
            _playerMagicWeaponList.Clear();
            _enemyMagicWeaponList.Clear();
        }
        public void Init()
        {
            CombatEventManager.Instance.AddEventListener(CombatEventType.MagicWeaponDie, MagicWeaponDie);
        }
        private void MagicWeaponDie(IEventData iEventData)
        {
            HeroDieEventData heroDieEventData = iEventData as HeroDieEventData;
            CombatMagicWeaponEntity combatMagicWeaponEntity =
                heroDieEventData.combatHeroEntity as CombatMagicWeaponEntity;
            _enemyMagicWeaponList.Remove(combatMagicWeaponEntity);
            _playerMagicWeaponList.Remove(combatMagicWeaponEntity);
            RemoveCollisionMagicWeapon(combatMagicWeaponEntity.MagicWeaponCollisionId);
        }
        public void SetMagicWeaponCombatSence(Vector3 myHeroPos, Vector3 fangXiang)
        {
            myEnterCombatPos = myHeroPos + fangXiang * 2 + new Vector3(0, 10, 0);
            enemyEnterCombatPos = myHeroPos + fangXiang * 18 + new Vector3(0, 10, 0);
        }
        /// 
        /// 将法宝添加导战斗场景
        /// 
        /// 
        public void AddMagicWeaponToSence(CombatMagicWeaponEntity combatMagicWeaponEntity)
        {
            if (combatMagicWeaponEntity.IsEnemy)
            {
                _enemyMagicWeaponList.Add(combatMagicWeaponEntity);
                combatMagicWeaponEntity.useIndex = _enemyMagicWeaponList.Count;
            }
            else
            {
                _playerMagicWeaponList.Add(combatMagicWeaponEntity);
                combatMagicWeaponEntity.useIndex = _playerMagicWeaponList.Count;
            }
            FindCollidingTarget(combatMagicWeaponEntity);
            combatMagicWeaponEntity.CombatAIBasic.ChangeState(CombatHeroStateType.Active);
        }
        public void TriggerMagicWeapon(CombatMagicWeaponEntity a, CombatMagicWeaponEntity b)
        {
        }
        public void Update(float t)
        {
            // for (int i = 0; i < _enemyMagicWeaponList.Count; i++)
            // {
            //     _enemyMagicWeaponList[i].Update(t);
            // }
            //
            // for (int i = 0; i < _playerMagicWeaponList.Count; i++)
            // {
            //     _playerMagicWeaponList[i].Update(t);
            // }
            for (magicWeaponCollisionInfoList.Begin(); magicWeaponCollisionInfoList.Next();)
            {
                magicWeaponCollisionInfoList.Value.Update(t);
            }
        }
        public MagicWeaponCollisionInfo FindMagicWeaponCollisionInfo(int id)
        {
            if (magicWeaponCollisionInfoList.TryGetValue(id, out var info))
            {
                return info;
            }
            return null;
        }
        private void FindCollidingTarget(CombatMagicWeaponEntity combatMagicWeaponEntity)
        {
            if (combatMagicWeaponEntity.isMagicWeaponTreasureBook)
            {
                return;
            }
            bool isEnemy = combatMagicWeaponEntity.IsEnemy;
            BetterList magicWeaponList =
                isEnemy ? _playerMagicWeaponList : _enemyMagicWeaponList;
            if (magicWeaponList == null)
            {
                return;
            }
            List nullTarget = new List();
            for (int i = 0; i < magicWeaponList.Count; i++)
            {
                if (magicWeaponList[i].CombatAIBasic.stateControl.CurrStateName != CombatHeroStateType.idle &&
                    magicWeaponList[i].CombatAIBasic.stateControl.CurrStateName != CombatHeroStateType.Active)
                {
                    continue;
                }
                // if (magicWeaponList[i].CollidingTarget == combatMagicWeaponEntity)
                // {
                //     return magicWeaponList[i];
                // }
                if (magicWeaponList[i].isMagicWeaponTreasureBook)
                {
                    continue;
                }
                if (magicWeaponList[i].MagicWeaponCollisionId < 0)
                {
                    nullTarget.Add(magicWeaponList[i]);
                }
            }
            if (nullTarget.Count > 0)
            {
                int index = CombatCalculateTool.Instance.GetOdd(0, nullTarget.Count);
                CombatMagicWeaponEntity target = nullTarget[index];
                MagicWeaponCollisionInfo magicWeaponCollisionInfo =
                    CObjectPool.Instance.Fetch();
                magicWeaponCollisionInfo.Init(combatMagicWeaponEntity, target, MagicWeaponCollisionID);
                magicWeaponCollisionInfoList.Add(MagicWeaponCollisionID, magicWeaponCollisionInfo);
                MagicWeaponCollisionID++;
            }
            return;
        }
        public void RemoveCollisionMagicWeapon(int id)
        {
            magicWeaponCollisionInfoList.Remove(id, out var collisionInfo);
            if (collisionInfo != null)
            {
                collisionInfo.Finish();
                CObjectPool.Instance.Recycle(collisionInfo);
            }
        }
        public void RemoveCollisionMagicWeapon(MagicWeaponCollisionInfo collisionInfo)
        {
            magicWeaponCollisionInfoList.Remove(collisionInfo.id);
            collisionInfo.Finish();
            CObjectPool.Instance.Recycle(collisionInfo);
        }
    }
}