-- TODO: Make requests buffer for 3 seconds or so using ?steamids=a,b,c,d
-- TODO: _SUPPORTER_ needs to be networked

local SUPPORTER_MESSAGE = "JetBoom says \"thank you for supporting my gamemodes!\" to you."

local CACHE = {
	MaxSize = 128,
	Cache = {}
}

function CACHE:Set(steamid, memberlevel, nolookup)
	if nolookup then
		table.insert(self.Cache, {steamid, memberlevel})
	else
		for i, tab in pairs(self.Cache) do
			if tab[1] == steamid then
				tab[2] = memberlevel
				return
			end
		end

		table.insert(self.Cache, {steamid, memberlevel})
	end

	if #self.Cache > self.MaxSize then
		table.remove(self.Cache, 1)
	end
end

function CACHE:Get(steamid)
	for i, tab in pairs(self.Cache) do
		if tab[1] == steamid then
			return tab[2]
		end
	end
end

function CACHE:Remove(steamid)
	for i, tab in pairs(self.Cache) do
		if tab[1] == steamid then
			table.remove(self.Cache, i)
			break
		end
	end
end

function CACHE:Save()
	local tosave = {}

	for steamid, level in pairs(self.Cache) do
		table.insert(tosave, steamid.."="..level)
	end

	file.Write("noxapi_cache.txt", table.concat(tosave, "\n"))
end

function CACHE:Load()
	if file.Exists("noxapi_cache.txt", "DATA") then
		self.Cache = {}

		for i, line in pairs(string.Explode("\n", file.Read("noxapi_cache.txt", "DATA"))) do
			local cont = string.Explode("=", line)
			local steamid, memberlevel = cont[1], tonumber(cont[2]) or 0

			self:Set(steamid, memberlevel, true)
		end
	end
end

--[[hook.Add("PlayerInitialSpawn", "noxapi", function(pl)
	if NDB then return end

	local steamid = pl:SteamID()
	local memberlevel = CACHE:Get(steamid)
	if memberlevel then
		if level == 1 or level == 2 then
			pl._SUPPORTER_ = true
			pl:PrintMessage(HUD_PRINTCONSOLE, SUPPORTER_MESSAGE)
		end
	else
		http.Fetch("http://www.noxiousnet.com/api/player/memberlevel?steamid="..steamid, function(body, len, headers, code)
			local level = tonumber(body) or 0

			if level == 1 or level == 2 then
				pl._SUPPORTER_ = true
				pl:PrintMessage(HUD_PRINTCONSOLE, SUPPORTER_MESSAGE)
			end

			CACHE:Set(steamid, level)
		end)
	end
end)

hook.Add("Initialize", "noxapi", function()
	resource.AddFile("materials/noxiousnet/noxicon.png")

	if not NDB then
		CACHE:Load()
	end
end)

hook.Add("ShutDown", "noxapi", function()
	if not NDB then
		CACHE:Save()
	end
end)

concommand.Add("noxapi_forcerefresh", function(sender, command, arguments)
	if NDB or sender._ForcedNoxAPILookup or sender._SUPPORTER_ then return end
	sender._ForcedNoxAPILookup = true

	local steamid = sender:SteamID()

	CACHE:Remove(steamid)

	http.Fetch("http://www.noxiousnet.com/api/player/memberlevel?steamid="..steamid, function(body, len, headers, code)
		local level = tonumber(body) or 0

		if level == 1 or level == 2 then
			pl._SUPPORTER_ = true
			pl:PrintMessage(HUD_PRINTCONSOLE, SUPPORTER_MESSAGE)
		end

		CACHE:Set(steamid, level)
	end)
end)]]