using UnityEngine;
using System;
using System.Collections.Generic;

namespace mgaia.Utils
{
    /// <summary>
    /// Extensões do Pool Manager
    /// </summary>
    /// <owner>Victor</owner>
    public static class PoolManagerExtensions
    {
        /// <summary>
        /// Cria todas as pools cadastradas na database
        /// </summary>
        public static void CreatePoolsUsingDatabase(this PoolManager poolManager)
        {
            PoolDatabaseScriptableObject.Instance.PoolElementsReferences.ForEach(poolReference => poolManager.CreatePool(poolReference.Path, poolReference.Quantity));
        }

        /// <summary>
        /// Carrega um elemento da pool, utilizando o registro no banco de dados
        /// </summary>
        public static T Pop<T>(this PoolManager poolManager, string alias) where T : PoolElement
        {
            return poolManager.Pop<T>(PoolDatabase.ReferenceForAlias(alias).Path);
        }

        /// <summary>
        /// Carrega um elemento da pool, utilizando o registro no banco de dados
        /// </summary>
        public static T Pop<T>(this PoolManager poolManager) where T : PoolElement
        {
            return Pop<T>(poolManager, typeof(T).Name);
        }

        /// <summary>
        /// Carrega um elemento utilizando o behaviour PoolElement no mesmo elemento, mas retorna o componente buscado
        /// UTIL para behaviours que não podem herdar de PoolElement por algum motivo
        /// </summary>
        public static T PopWithoutPoolElement<T>(this PoolManager poolManager, string alias) where T : Component
        {
            return Pop<PoolElement>(poolManager, alias).GetComponent<T>();
        }

        /// <summary>
        /// Carrega um elemento utilizando o behaviour PoolElement no mesmo elemento, mas retorna o componente buscado
        /// OBS: Procura dentro do database
        /// /// UTIL para behaviours que não podem herdar de PoolElement por algum motivo
        /// </summary>
        public static T PopWithoutPoolElement<T>(this PoolManager poolManager) where T : Component
        {
            return PopWithoutPoolElement<T>(poolManager, typeof(T).Name);
        }

        /// <summary>
        /// Carrega um elemento utilizando o behaviour PoolElement no mesmo elemento, mas retorna o componente buscado
        /// OBS: Procura fora do database
        /// UTIL para behaviours que não podem herdar de PoolElement por algum motivo
        /// </summary>
        public static T PopWithoutPoolElementOutsideDatabase<T>(this PoolManager poolManager, string path) where T : Component
        {
            return poolManager.Pop<PoolElement>(path).GetComponent<T>();
        }
    }
}