--Global config and function table.
snow = {
	legacy = true,
	sleds = true,
	enable_snowfall = true,
	lighter_snowfall = false,
	debug = false,
	smooth_biomes = true,
	christmas_content = true,
	smooth_snow = true,
	min_height = 3,
}

--Config documentation.
local doc = {
	legacy = "Whether you are running a legacy minetest version (auto-detected).",
	sleds = "Disable this to prevent sleds from being riden.",
	enable_snowfall = "Enables falling snow.",
	lighter_snowfall = "Reduces the amount of resources and fps used by snowfall.",
	debug = "Enables debug output.",
	smooth_biomes = "Enables smooth transition of biomes",
	christmas_content = "Disable this to remove christmas saplings from being found.",
	smooth_snow = "Disable this to stop snow from being smoothed.",
	min_height = "The minumum height a snow biome will generate.",
}

--Manage config.
--Saves contents of config to file.
local function saveConfig(path, config, doc)
	local file = io.open(path,"w")
	if file then
		for i,v in pairs(config) do
			local t = type(v)
			if t == "string" or t == "number" or t == "boolean" then
				if doc and doc[i] then
					file:write("# "..doc[i].."\n")
				end
				file:write(i.." = "..tostring(v).."\n")
			end
		end
	end
end
--Loads config and returns config values inside table.
local function loadConfig(path)
	local config = {}
	local file = io.open(path,"r")
  	if file then
  		io.close(file)
		for line in io.lines(path) do
			if line:sub(1,1) ~= "#" then
				local i, v = line:match("^(%S*) = (%S*)")
				if i and v then
					if v == "true" then v = true end
					if v == "false" then v = false end
					if tonumber(v) then v = tonumber(v) end
					config[i] = v
				end
			end
		end
		return config
	else
		--Create config file.
		return nil
	end
end

minetest.register_on_shutdown(function() saveConfig(minetest.get_modpath("snow").."/config.txt", snow, doc) end)

local config = loadConfig(minetest.get_modpath("snow").."/config.txt")
if config then
	for i,v in pairs(config) do
		if type(snow[i]) == type(v) then
			snow[i] = v
		end
	end
else
	saveConfig(minetest.get_modpath("snow").."/config.txt", snow, doc)
end

for i,v in pairs(snow) do
	local t = type(v)
	if t == "string" or t == "number" or t == "boolean" then
		local v = minetest.setting_get("snow_"..i)
		if v ~= nil then
			if v == "true" then v = true end
			if v == "false" then v = false end
			if tonumber(v) then v = tonumber(v) end
			snow[i] = v
		end
	end
end

--AUTO DETECT and/or OVERIDEN values--

--legacy--
--Detect if we are running the latest minetest.
if minetest.register_on_mapgen_init then
	snow.legacy = false
else
	snow.legacy = true
end
if config and snow.legacy ~= config.legacy then
	saveConfig(minetest.get_modpath("snow").."/config.txt", snow, doc)
end

--MENU

local get_formspec = function()
	local p = -0.5
	local formspec = "label[0,-0.3;Settings:]"
	for i,v in pairs(snow) do
		local t = type(v)
		if t == "string" or t == "number" then
			p = p + 1.5
			formspec = formspec.."field[0.3,"..p..";2,1;snow:"..i..";"..i..";"..v.."]"
		elseif t == "boolean" then
			p = p + 0.5
			formspec = formspec.."checkbox[0,"..p..";snow:"..i..";"..i..";"..tostring(v).."]"
		end
	end
	p = p + 1
	formspec = "size[4,"..p..";]\n"..formspec
	return formspec
end

minetest.register_on_player_receive_fields(function(player, formname, fields)
	if formname == "snow:menu" then
		for i,v in pairs(snow) do
			local t = type(v)
			if t == "string" or t == "number" or t == "boolean" then
				if fields["snow:"..i] then
					if t == "string" then 
						snow[i] = fields["snow:"..i] 
					end
					if t == "number" then 
						snow[i] = tonumber(fields["snow:"..i]) 
					end
					if t == "boolean" then 
						if fields["snow:"..i] == "true" then snow[i] = true end
						if fields["snow:"..i] == "false" then snow[i] = false end
					end
				end	
			end
		end
	end
end)


minetest.register_chatcommand("snow", {
	description = "Show a menu for various actions",
	privs = {server=true},
	func = function(name, param)
		minetest.show_formspec(name, "snow:menu", get_formspec())
	end,
})
