using System;
using System.Collections.Generic;
using _Project.Develop.Runtime.Entities;

namespace _Project.Develop.Runtime.Logic.Gameplay.Features.AI
{
    public class AIBrainsContext : IDisposable
    {
        private readonly List<EntityToBrain> _entityToBrains = new ();

        public void SetFor(Entity entity, IBrain brain)
        {
            foreach (EntityToBrain item in _entityToBrains)
            {
                if (item.Entity == entity)
                {
                    item.Brain.Disable();
                    item.Brain.Dispose();
                    item.Brain = brain;
                    item.Brain.Enable();
                    
                    return;
                }
            }
            
            _entityToBrains.Add(new EntityToBrain(brain, entity));
            brain.Enable();
        }
   
        public void Update(float deltaTime)
        {
            for (int i = 0; i < _entityToBrains.Count; i++)
            {
                if (_entityToBrains[i].Entity.IsInit == false)
                {
                    int lastIndex = _entityToBrains.Count - 1;

                    _entityToBrains[i].Brain.Dispose();
                    _entityToBrains[i] = _entityToBrains[lastIndex];
                    _entityToBrains.RemoveAt(lastIndex);
                    i--;
                    
                    continue;
                }

                _entityToBrains[i].Brain.Update(deltaTime);
            }
        }
        
        public void Dispose()
        {
            foreach (EntityToBrain entityToBrain in _entityToBrains)
                entityToBrain.Brain.Dispose();

            _entityToBrains.Clear();
        }

        private class EntityToBrain
        {
            public Entity Entity;
            public IBrain Brain;
            
            public EntityToBrain(IBrain brain, Entity entity)
            {
                Brain = brain;
                Entity = entity;
            }
        }
    }
}