using System.Collections.Generic;
using UnityEngine;

public class PoolManager : Singleton<PoolManager>
{
    private Dictionary<EResourceType, Dictionary<int, List<GameObject>>> _resourcePool;
    private List<GameObject> _useList;

    public PoolManager()
    {
        _resourcePool = new Dictionary<EResourceType, Dictionary<int, List<GameObject>>>();
        _useList = new List<GameObject>();
    }

    public List<GameObject> UseList { get => _useList; }

    /// <summary>
    /// 从对象池获取资源
    /// </summary>
    /// <param name="type">资源类型</param>
    /// <param name="id">资源 id</param>
    /// <returns>资源对象</returns>
    public GameObject GetResourceInFreePool(EResourceType type, int id)
    {
        GameObject tempObj = null;
        // 判断对象池是否有该类型对象
        if (_resourcePool.ContainsKey(type))
        {
            // 判断空闲对象池是否有该 id
            if (_resourcePool[type].ContainsKey(id))
            {
                // 如果个数大于 0
                if (_resourcePool[type][id].Count > 0)
                {
                    tempObj = _resourcePool[type][id][0];
                    _resourcePool[type][id].Remove(tempObj);
                }
            }
        }
        // 没有则创建
        if (null == tempObj) tempObj = NewResource(type, id);
        // 加入使用列表
        UseList.Add(tempObj);
        tempObj.SetActive(true);
        return tempObj;
    }

    /// <summary>
    /// 回收所有资源
    /// </summary>
    public void RecycleResource()
    {
        for (int i = UseList.Count - 1; i >= 0; i--)
        {
            RecycleResource(UseList[i]);
        }
    }

    /// <summary>
    /// 回收资源
    /// </summary>
    /// <param name="gameObject">资源对象</param>
    public void RecycleResource(GameObject gameObject)
    {
        EResourceType type = EResourceType.Actor;
        if (gameObject.GetComponent<EnvironmentController>()) type = EResourceType.Environment;
        else if (gameObject.GetComponent<ItemController>()) type = EResourceType.Item;
        else if (gameObject.GetComponent<ActorController>()) type = EResourceType.Actor;
        else if (gameObject.GetComponent<EnemyController>())
        {
            // 触发怪物死亡事件
            if (gameObject.GetComponent<EnemyController>().Health == 0) gameObject.GetComponent<EnemyController>().OnDeath?.Invoke();
            // 怪物需要重置生命值
            type = EResourceType.Enemy;
            gameObject.GetComponent<EnemyController>().Health = gameObject.GetComponent<EnemyController>().MaxHealth;
        }
        else return;
        int id = gameObject.GetComponent<ResourceController>().ID;
        // 判断对象池是否有该类型对象
        if (_resourcePool.ContainsKey(type))
        {
            // 判断对象池是否有该 id
            if (_resourcePool[type].ContainsKey(id)) _resourcePool[type][id].Add(gameObject);
            // 没有则增加
            else
            {
                List<GameObject> tempList = new List<GameObject>();
                tempList.Add(gameObject);
                _resourcePool[type].Add(id, tempList);
            }
        }
        // 没有则增加
        else
        {
            Dictionary<int, List<GameObject>> tempDic = new Dictionary<int, List<GameObject>>();
            List<GameObject> tempList = new List<GameObject>();
            tempList.Add(gameObject);
            tempDic.Add(id, tempList);
            _resourcePool.Add(type, tempDic);
        }
        // 将物体从使用列表中删除
        UseList.Remove(gameObject);
        // 将物体设置为禁用
        gameObject.SetActive(false);
    }

    /// <summary>
    /// 创建资源
    /// </summary>
    /// <param name="type">对象类型</param>
    /// <param name="id">对象 id</param>
    /// <returns>资源对象</returns>
    private GameObject NewResource(EResourceType type, int id)
    {
        return GameManager.Instance.ResourceManager.LoadResource(type, id);

    }
}