-- recursive dump function
function dumpLevel(input, level)
	local indent = ""

	for i = 1, level do
		indent = indent .. "    "
	end

	if type(input) == "table" then
		local str = "{ \n"
		local lines = {}

		for k, v in pairs(input) do
			if type(k) ~= "number" then
				k = '"' .. k .. '"'
			end

			if type(v) == "string" then
				v = '"' .. v .. '"'
			end

			table.insert(lines, indent .. "    [" .. k .. "] = " .. dumpLevel(v, level + 1))
		end
		return str .. table.concat(lines, ",\n") .. "\n" .. indent .. "}"
	end

	return tostring(input)
end

-- Return a string representation of input for debugging purposes
function dump(input)
	return dumpLevel(input, 0)
end

-- Call the dump function and print it to console
function pdump(input)
	local dump_str = dump(input)
	logger.debug(dump_str)
	return dump_str
end

-- Call the dump function with a title and print it beautifully to the console
function tdump(title, input)
	local title_fill = ""
	for i = 1, title:len() do
		title_fill = title_fill .. "="
	end

	local header_str = "\n====" .. title_fill .. "====\n"
	header_str = header_str .. "=== " .. title .. " ===\n"
	header_str = header_str .. "====" .. title_fill .. "====\n"

	local dump_str = dump(input)
	local footer_str = "\n====" .. title_fill .. "====\n"

	logger.debug(header_str .. dump_str .. footer_str)

	return dump_str
end
