local sharedconfig={}
local logging=require((...):gsub("(.)$", "%1.") .. 'logging')
local sharedstate=require((...):gsub("(.)$", "%1.") .. 'sharedstate')
sharedstate=require('nulllib.sharedstate')

local defaults_table

--- Internal; Add default value if not saved
--- Adds a value to the shared config store, falling back to a default value if
--none is stored
---@param key string Key
---@param value any Value
local function add_default_value(key, value)
	defaults_table=defaults_table or {}
	defaults_table[key]=value

	local stored_value=config:load(key)
	sharedstate.init(key, value)

	if stored_value ~= nil then
		sharedstate.queue(key, stored_value)
	end
end

--- Initialize sharedconfig
-- Initialize shared config with default configuration
---@param defaults table
function sharedconfig.load_defaults(defaults)
	logging.trace("sharedconfig.load_defaults", defaults)
	for k, v in pairs(defaults) do
		add_default_value(k, v)
	end
	sharedstate.commit()
end

local function build_table()
	local t={}
	-- defaults haven't been initialized yet
	if defaults_table == nil then return nil end
	for k, _ in pairs(defaults_table) do
		t[k]=sharedstate.get(k)
	end
	return t
end

--- Load config
---@param key? string Key to load
function sharedconfig.load(key)
	if key == nil then
		return build_table()
	end
	-- defaults haven't been initialized yet
	if defaults_table == nil then return nil end

	return sharedstate.get(key)
end

--- Save config
---@param key string Key to save
---@param value any Value to save
function sharedconfig.save(key, value)
	config:save(key, value)
	sharedstate.set(key, value)
end

return sharedconfig