minetest.register_entity("pclasses:item", {
	initial_properties = {
		hp_max = 1,
		physical = false,
		collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
		visual = "sprite",
		visual_size = {x=0.5, y=0.5},
		textures = {""},
		spritediv = {x=1, y=1},
		initial_sprite_basepos = {x=0, y=0},
		is_visible = false,
	},
	itemname = '',
	class = '',
	set_class = function(self, class)
		self.class = class
	end,
	set_item = function(self, itemstring)
		self.itemname = itemstring
		local itemname = itemstring
		local item_texture = nil
		local item_type = ""
		if minetest.registered_items[itemname] then
			item_texture = minetest.registered_items[itemname].inventory_image
			item_type = minetest.registered_items[itemname].type
		end
		local prop = {
			is_visible = true,
			visual = "sprite",
			textures = {"unknown_item.png"}
		}
		if item_texture and item_texture ~= "" then
			prop.visual = "sprite"
			prop.textures = {item_texture}
			prop.visual_size = {x=0.50, y=0.50}
		else
			prop.visual = "wielditem"
			prop.textures = {itemname}
			prop.visual_size = {x=0.25, y=0.25}
			prop.automatic_rotate = math.pi * 0.10
		end
		self.object:set_properties(prop)
	end,
	on_rightclick = function(self, clicker)
		action_timers.wrapper(
			clicker:get_player_name(),
			"class switch",
			"class_switch_" .. clicker:get_player_name(),
			3600,
			pclasses.api.set_player_class,
			{clicker:get_player_name(), self.class, true}
		)
	end,
	on_activate = function(self, staticdata)
		local tab = minetest.deserialize(staticdata)
		if tab then
			self.itemname = tab.itemname
			self.class = tab.class
		else
			self.itemname = staticdata:split("|")[1]
			self.class = staticdata:split("|")[2]
		end
		self.object:set_armor_groups({immortal=1})
		self:set_item(self.itemname)
	end,
	get_staticdata = function(self)
		return minetest.serialize({itemname = self.itemname, class = self.class})
	end,
})

function pclasses.register_class_switch(cname, params)
	local color = params.color or { r = 255, g = 255, b = 255 }
	local txtcolor = string.format("#%02x%02x%02x", color.r, color.g, color.b)
	local overlay = "pclasses_class_switch_orb_overlay.png"
	local holo_item = params.holo_item or "default:diamond"
	minetest.register_node(":pclasses:class_switch_" .. cname, {
		description = "Class switch orb (" .. cname .. ")",
		tiles = {(params.tile or overlay) .. "^[colorize:" .. txtcolor .. ":200"},
		drawtype = "nodebox",
		node_box = { type = "fixed", fixed = {
			{-7/16, -8/16, -7/16, 7/16, -7/16, 7/16}, -- bottom plate
			{-6/16, -7/16, -6/16, 6/16, -6/16, 6/16}, -- bottom plate (upper)
			{-0.25, -6/16, -0.25, 0.25, 11/16, 0.25}, -- pillar
			{-7/16, 11/16, -7/16, 7/16, 12/16, 7/16}, -- top plate
		}},
		can_dig = function(pos, player) return minetest.get_player_privs(player:get_player_name()).server == true end,
		sunlight_propagates = true,
		light_source = 10,
		sounds = default.node_sound_glass_defaults(),
		groups = {unbreakable = 1},
		after_place_node = function(pos)
			pos.y = pos.y + 1

			-- Clean remaining entities
			for _,ref in pairs(minetest.get_objects_inside_radius(pos, 0.3)) do
				local e = ref:get_luaentity()
				if e and e.name == "pclasses:item" then
					ref:remove()
				end
			end

			local obj = minetest.add_entity(pos, "pclasses:item")
			if obj then
				obj:get_luaentity():set_item(holo_item)
				obj:get_luaentity():set_class(cname)
			end
			pos.y = pos.y - 1
			local timer = minetest.get_node_timer(pos)
			timer:start(3)
		end,
		on_timer = function(pos)
			pos.y = pos.y + 1
			for _,ref in pairs(minetest.get_objects_inside_radius(pos, 0.3)) do
				local e = ref:get_luaentity()
				if e and e.name == "pclasses:item" then
					return true
				end
			end

			local obj = minetest.add_entity(pos, "pclasses:item")
			if obj then
				obj:get_luaentity():set_item(holo_item)
				obj:get_luaentity():set_class(cname)
			end
			return true
		end,
		on_destruct = function(pos)
			pos.y = pos.y + 1
			for _,ref in pairs(minetest.get_objects_inside_radius(pos, 0.3)) do
				local e = ref:get_luaentity()
				if e and e.name == "pclasses:item" then
					ref:remove()
				end
			end
		end,
	})
end