local player_huds = {}

local states = {
	{0, "Normal font"},
	{1, "Bold font"},
	{2, "Italic font"},
	{3, "Bold and italic font"},
	{4, "Monospace font"},
	{5, "Bold and monospace font"},
	{7, "ZOMG all the font styles"},
}


local default_def = {
	hud_elem_type = "text",
	position = {x = 0.5, y = 0.5},
	scale = {x = 2, y = 2},
	alignment = { x = 0, y = 0 },
}

local function add_hud(player, state)
	local def = table.copy(default_def)
	local statetbl = states[state]
	def.offset = {x = 0, y = 32 * state}
	def.style = statetbl[1]
	def.text = statetbl[2]
	return player:hud_add(def)
end

minetest.register_on_leaveplayer(function(player)
	player_huds[player:get_player_name()] = nil
end)

local etime = 0
local state = 0

minetest.register_globalstep(function(dtime)
	etime = etime + dtime
	if etime < 1 then
		return
	end
	etime = 0
	for _, player in ipairs(minetest.get_connected_players()) do
		local huds = player_huds[player:get_player_name()]
		if huds then
			for i, hud_id in ipairs(huds) do
				local statetbl = states[(state + i) % #states + 1]
				player:hud_change(hud_id, "style", statetbl[1])
				player:hud_change(hud_id, "text", statetbl[2])
			end
		end
	end
	state = state + 1
end)

minetest.register_chatcommand("hudfonts", {
	params = "",
	description = "Show/Hide some text on the HUD with various font options",
	func = function(name, param)
		local player = minetest.get_player_by_name(name)
		local param = tonumber(param) or 0
		param = math.min(math.max(param, 1), #states)
		if player_huds[name] == nil then
			player_huds[name] = {}
			for i = 1, param do
				table.insert(player_huds[name], add_hud(player, i))
			end
			minetest.chat_send_player(name, ("%d HUD element(s) added."):format(param))
		else
			local huds = player_huds[name]
			if huds then
				for _, hud_id in ipairs(huds) do
					player:hud_remove(hud_id)
				end
				minetest.chat_send_player(name, "All HUD elements removed.")
			end
			player_huds[name] = nil
		end
		return true
	end,
})