-- ------------------------------------------------------------------------------ --
--                                TradeSkillMaster                                --
--                          https://tradeskillmaster.com                          --
--    All Rights Reserved - Detailed license information included with addon.     --
-- ------------------------------------------------------------------------------ --

--- JSON Functions
-- @module JSON

local _, TSM = ...
local JSON = TSM.Init("Util.JSON")
local private = {}



-- ============================================================================
-- Module Functions
-- ============================================================================

function JSON.Encode(value)
	if type(value) == "string" then
		return "\""..private.SanitizeString(value).."\""
	elseif type(value) == "number" or type(value) == "boolean" then
		return tostring(value)
	elseif type(value) == "table" then
		local absCount = 0
		for _ in pairs(value) do
			absCount = absCount + 1
		end
		local tblParts = {}
		if #value == absCount then
			for _, v in ipairs(value) do
				tinsert(tblParts, JSON.Encode(v))
			end
			return "["..table.concat(tblParts, ",").."]"
		else
			for k, v in pairs(value) do
				tinsert(tblParts, "\""..private.SanitizeString(k).."\":"..JSON.Encode(v))
			end
			return "{"..table.concat(tblParts, ",").."}"
		end
	else
		error("Invalid type: "..type(value))
	end
end



-- ============================================================================
-- Private Helper Functions
-- ============================================================================

function private.SanitizeString(str)
	str = gsub(str, "\124cff[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]([^\124]+)\124r", "%1")
	str = gsub(str, "[\\]+", "/")
	str = gsub(str, "\"", "'")
	return str
end
