XSceneResourceManager = XSceneResourceManager or {}

local ScenePoolRoot = nil
local ResourceMap = nil

-- 初始化
function XSceneResourceManager.InitPool()
    if XTool.UObjIsNil(ScenePoolRoot) then
        ScenePoolRoot = CS.UnityEngine.GameObject("ScenePoolRoot")
        ScenePoolRoot:SetActive(false)
        CS.UnityEngine.Object.DontDestroyOnLoad(ScenePoolRoot)
    end

    XSceneResourceManager.ClearPool()
    ResourceMap = {}
end

-- 出池
function XSceneResourceManager.GetGoFromPool(path)
    if not ResourceMap then
        ResourceMap = {}
    end

    local temp = ResourceMap[path]
    if not temp then
        temp = {}
        temp.Gos = {}
        ResourceMap[path] = temp
    end

    if not temp.Resource then
        temp.Resource = CS.XResourceManager.Load(path)
    end

    local go

    while (#temp.Gos > 0) do
        go = table.remove(temp.Gos, #temp.Gos)
        if not XTool.UObjIsNil(go) then
            go:SetActive(true)
            break
        end
    end

    if XTool.UObjIsNil(go) then
        go = CS.UnityEngine.Object.Instantiate(temp.Resource.Asset)
    end

    return go
end

-- 回池
function XSceneResourceManager.ReturnGoToPool(path, go)
    if XTool.UObjIsNil(go) then
        return
    end

    if not ResourceMap then
        ResourceMap = {}
    end

    local temp = ResourceMap[path]
    if not temp then
        temp = {}
        temp.Gos = {}
        ResourceMap[path] = temp
    end

    if not temp.Resource then
        CS.UnityEngine.GameObject.Destroy(go)
        return
    end

    go.transform:SetParent(ScenePoolRoot.transform, false)
    table.insert(temp.Gos, go)
end

-- 清池
function XSceneResourceManager.ClearPool()
    if ResourceMap then
        for _, v in pairs(ResourceMap) do
            -- 销毁GameObject
            if v.Gos then
                for _, go in ipairs(v.Gos) do
                    if not XTool.UObjIsNil(go) then
                        CS.UnityEngine.GameObject.Destroy(go)
                    end
                end
            end
            v.Gos = nil

            -- 释放资源
            if v.Resource then
                v.Resource:Release()
            end
        end
    end

    ResourceMap = nil
end