local Event = require 'utils.event'
local Token = require 'utils.token'

local Global = {}

local load_data = {}
local init_data = {}

function Global.register(tbl, callback)
    local token = Token.register_global(tbl)
    table.insert(load_data, {callback = callback, token = token})
end

function Global.register_init(tbl, init_handler, callback)
    local token = Token.register_global(tbl)
    table.insert(load_data, {callback = callback, token = token})

    table.insert(init_data, {token = token, init_handler = init_handler, callback = callback})
end

Event.on_load(
    function()
        for _, d in ipairs(load_data) do
            local tbl = Token.get_global(d.token)
            d.callback(tbl)
        end

        load_data = nil
        init_data = nil
    end
)

Event.on_init(
    function()
        for _, d in ipairs(init_data) do
            local tbl = Token.get_global(d.token)
            d.init_handler(tbl)
            d.callback(tbl)
        end

        load_data = nil
        init_data = nil
    end
)

return Global
