using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Game;
using UnityEditor;
using Axibug.Resources;

public enum E_PREFAB_TYPE
{
    NONE,
    EFFECT,
}

// 局部对象池模板
public class PrefabPool<T> where T : MonoBehaviour
{
    private Transform mb_vParentTf;                         // 创建对象时的父节点
    private List<T> mb_vObjList;                            // 对象列表
    private string mb_vPrefabPath;                          // 对象预制名称
    private E_PREFAB_TYPE mb_vPrefabType;

    public int iActivityCount
    {
        get
        {
            int retCount = 0;

            if (mb_vObjList != null)
            {
                for (int i = 0; i < mb_vObjList.Count; i++)
                {
                    if (mb_vObjList[i].gameObject.activeSelf)
                        retCount++;
                }
            }

            return retCount;
        }
    }


    public List<T> vObjList
    {
        get
        {
            if (mb_vObjList == null)
                mb_vObjList = new List<T>();

            return mb_vObjList;
        }
    }

    // 默认构造 需要配合 Init()使用
    public PrefabPool() { }

    // 构造 并 Init()
    public PrefabPool(Transform tfParent, E_PREFAB_TYPE type)
    {
        string vPrefabName = typeof(T).FullName;
        mb_vPrefabType = type;
        this.Init(tfParent, vPrefabName);
    }

    // 初始化
    void Init(Transform tfParent, string vPrefabName)
    {
        mb_vParentTf = tfParent;
        switch (mb_vPrefabType)
        {
            case E_PREFAB_TYPE.EFFECT:
                mb_vPrefabPath = $"Assets/GameAssets/Prefabs/Effect/{vPrefabName}/{vPrefabName}.prefab";
                break;
        }
    }

    // 隐藏
    public void Hide()
    {
        for (int i = 0; i < vObjList.Count; i++)
        {
            vObjList[i].gameObject.SetActive(false);
        }
    }

    // 隐藏父节点
    public void HideNode()
    {
        mb_vParentTf.gameObject.SetActive(false);
    }

    // 显示父节点
    public void ShowNode()
    {
        mb_vParentTf.gameObject.SetActive(true);

    }
    // 获取
    public T GetObj(int index)
    {
        if (index < vObjList.Count)
        {
            vObjList[index].gameObject.SetActive(true);
            return vObjList[index];
        }

        GameObject go = ClonePrefab(mb_vPrefabPath, mb_vParentTf);
        T vObj = go.GetComponent<T>();
        if (vObj == null)
            vObj = go.AddComponent<T>();

        vObjList.Add(vObj);
        return vObj;
    }

    // 获取
    public T GetAnyHide()
    {
        int count = vObjList.Count;
        for (int i = 0; i < count; i++)
        {
            if (!vObjList[i].gameObject.activeSelf)
            {
                vObjList[i].gameObject.SetActive(true);
                return vObjList[i];
            }
        }

        return GetObj(count);
    }


    public void Remove(int index)
    {
        if (index >= vObjList.Count)
            return;

        T vObj = vObjList[index];
        GameObject.Destroy(vObj.gameObject);
        vObjList.RemoveAt(index);
    }

    public void Remove(T obj)
    {
        for (int i = 0; i < vObjList.Count; i++)
        {
            if (vObjList[i] == obj)
            {
                GameObject.Destroy(obj.gameObject);
                vObjList.RemoveAt(i);
                return;
            }
        }
    }

    // 销毁
    public void Destory()
    {
        for (int i = 0; i < vObjList.Count; i++)
        {
            T vObj = vObjList[i];
            GameObject.Destroy(vObj.gameObject);
        }
        vObjList.Clear();
    }


    private GameObject ClonePrefab(string path, Transform parent)
    {
        string rootPath = "Assets/GameAssets";
        string MapName = path;
        string tmp = MapName.Remove(0, rootPath.Length + 1);
        int idx = tmp.LastIndexOf('/');
        string bundleName = tmp.Substring(0, idx);

        UnityEngine.Object asset = null;
        if (AppEntry.Base.EditorResourceMode)
        {
#if UNITY_EDITOR
            asset = AssetDatabase.LoadAssetAtPath<GameObject>(MapName);
#endif
        }
        else
        {
            int id = MapName.GetHashCode();
            asset = PrefabManager.LoadPrefab<UnityEngine.Object>(bundleName.ToLower(), MapName, id, parent);
        }

        if (asset == null)
        {
            Debug.LogError($"asset加载失败,path={MapName}");
            return null;
        }

        GameObject go = GameObject.Instantiate(asset, parent) as GameObject;
        if (go == null)
        {
            Debug.LogError("LoadPrefabByEditor2. go == null. asset:" + asset);

        }
        return go;
    }
}