local hooks, overrides, M = {}, {}, {}
local allowed_hooks = {
   "install_plugins",
   "setup_mappings",
   "ready",
}

local function has_value(tab, val)
   for _, value in ipairs(tab) do
      if value == val then
         return true
      end
   end

   return false
end

M.add = function(name, fn)
   if not (has_value(allowed_hooks, name)) then
      error("Custom lua uses unallowed hook " .. name)
   end
   if hooks[name] == nil then
      hooks[name] = {}
   end
   table.insert(hooks[name], fn)
end

M.run = function(name, args)
   if hooks[name] == nil then
      return
   end

   for _, hook in pairs(hooks[name]) do
      hook(args)
   end
end

M.createOverrides = function(module)
   local O = {}

   O.get = function(name, default)
      local current = default
      if overrides[module] and overrides[module][name] then
         if type(overrides[module][name]) == "function" then
            current = overrides[module][name]
         elseif type(overrides[module][name]) == "table" then
            for _, override in pairs(overrides[module][name]) do
               current = override(current)
            end
         end
      end
      return current
   end

   return O
end

M.override = function(module, name, overwrite)
   if overrides[module] == nil then
      overrides[module] = {}
   end
   if overrides[module][name] == nil then
      overrides[module][name] = {}
   end
   table.insert(overrides[module][name], overwrite)
end

return M