using System;
using System.Collections.Generic;
using Unity.BossRoom.Gameplay.GameplayObjects;
using UnityEngine.Pool;
using Object = UnityEngine.Object;

namespace Unity.BossRoom.Gameplay.Actions
{
    public static class ActionFactory
    {
        private static Dictionary<ActionID, ObjectPool<Action>> s_ActionPools = new Dictionary<ActionID, ObjectPool<Action>>();

        private static ObjectPool<Action> GetActionPool(ActionID actionID)
        {
            if (!s_ActionPools.TryGetValue(actionID, out var actionPool))
            {
                actionPool = new ObjectPool<Action>(
                    createFunc: () => Object.Instantiate(GameDataSource.Instance.GetActionPrototypeByID(actionID)),
                    actionOnRelease: action => action.Reset(),
                    actionOnDestroy: Object.Destroy);

                s_ActionPools.Add(actionID, actionPool);
            }

            return actionPool;
        }


        /// <summary>
        /// Factory method that creates Actions from their request data.
        /// </summary>
        /// <param name="data">the data to instantiate this skill from. </param>
        /// <returns>the newly created action. </returns>
        public static Action CreateActionFromData(ref ActionRequestData data)
        {
            var ret = GetActionPool(data.ActionID).Get();
            ret.Initialize(ref data);
            return ret;
        }

        public static void ReturnAction(Action action)
        {
            var pool = GetActionPool(action.ActionID);
            pool.Release(action);
        }

        public static void PurgePooledActions()
        {
            foreach (var actionPool in s_ActionPools.Values)
            {
                actionPool.Clear();
            }
        }
    }
}