------------------------
-- PClasses' inventory
--

-- Inventory for 'dead' items
pclasses.api.create_graveyard_inventory = function(player)
	local pname = player:get_player_name()
	local grave_inv = minetest.get_inventory({type = "detached", name = pname .. "_graveyard"})
	if grave_inv then
		return grave_inv
	end
	local player_inv = minetest.get_inventory({type = "player", name = pname})
	grave_inv = minetest.create_detached_inventory(pname .. "_graveyard", {
		on_take = function(inv, listname, index, stack, player)
			player_inv:set_stack(listname, index, nil)
		end,
		on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
			local stack = inv:get_stack(to_list, to_index)
			player_inv:set_stack(to_list, to_index, stack)
			player_inv:set_stack(from_list, from_index, nil)
		end,
		allow_take = function(inv, listname, index, stack, player)
			player_inv:set_stack(listname, index, nil)
			return stack:get_count()
		end,
		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
			return 0
		end,
		allow_put = function(inv, listname, index, stack, player)
			return 0
		end,
	})
	grave_inv:set_size("graveyard", 7*8)
	player_inv:set_size("graveyard", 7*8)
	for i = 1,56 do
		local stack = player_inv:get_stack("graveyard", i)
		grave_inv:set_stack("graveyard", i, stack)
	end
	return grave_inv
end

unified_inventory.register_button("graveyard", {
	type = "image",
	image = "pclasses_grave_button.png",
	tooltip = "Item Graveyard",
})

unified_inventory.register_page("graveyard", {
	get_formspec = function(player)
		local pname = player:get_player_name()
		local form = "label[0,0;Graveyard]" ..
			"list[detached:" .. pname .. "_graveyard;graveyard;0.5,0.7;7,8]"
		return {formspec = form, draw_inventory = false}
	end
})

minetest.register_chatcommand("clear_graveyard", {
	description = "Clear Graveyard Inventory",
	privs = {},
	func = function(name, param)
		local grave_inv = minetest.get_inventory({type = "detached", name = name .. "_graveyard"})
		grave_inv:set_list("graveyard", {})
		minetest.get_player_by_name(name):get_inventory():set_list("graveyard", {})
		return true, "Graveyard flushed"
	end,
})

function pclasses.api.vacuum_graveyard(player)
	local pname = player:get_player_name()
	local grave_inv = minetest.get_inventory({type = "detached", name = pname .. "_graveyard"})
	local player_inv = minetest.get_inventory({type = "player", name = pname})

	if not grave_inv then return end

	for i = 1,7*8 do
		local stack = grave_inv:get_stack("graveyard", i)
		if pclasses.data.reserved_items[stack:get_name()] and pclasses.api.util.can_have_item(pname, stack:get_name()) then
			grave_inv:set_stack("graveyard", i, nil)
			player_inv:set_stack("graveyard", i, nil)
			if player_inv:room_for_item("main", stack) then
				player_inv:add_item("main", stack)
			else
				minetest.add_item(player:getpos(), stack)
			end
		end
	end
end

-- Inventory description buttons
local pbutton_form = "size[10,10]" ..
   "button_exit[4.5,9.5;1,0.5;pmenu_leave;Leave]" ..
   "tabheader[0,0;pmenu_header;infos"

function pclasses.api.textify(text)
	return ("textarea[0.5,0.2;9.6,5.8;pmenu_data;;%s]"):format(text)
end

local pbuttons = {}
local pforms = {}
local pinfo = pclasses.api.textify(
      "PClasses (Player Classes) allows you to become a member of specific classes implemented " ..
      "with abilities, advantages, and reserved items. Each one of the classes defined grants " ..
      "the right to carry items, called reserved items, tied to the abilities of a class. A " ..
      "hunter will be able to use arrows, whereas a warrior can own powerful weapons. Each time " ..
      "you switch classes, you will lose your stats and items, the latter being transfered into " ..
      "a special part of your inventory, the graveyard. Once you return to a class that allows " ..
      "you to use those items, they will return in your main inventory.\n" ..
      "You can use this menu to navigate between classes and read informations about what " ..
      "abilities come with specific classes.\n" ..
      "You can see on this man the location of all class buildings available, containing their " ..
      "respective class pedestals."
) .. "image[2.4,5.6;6,4;pclasses_buildings.png]"


minetest.after(0, function()
		  for cname, cdef in pairs(pclasses.classes) do
		     if cname ~= pclasses.conf.superuser_class then
			pbutton_form = pbutton_form .. ',' .. cname
			table.insert(pbuttons, cname)
		     end
		  end
		  pbutton_form = pbutton_form .. ";1]"
end)

minetest.register_on_player_receive_fields(function(player, formname, fields)
      if formname ~= "" then return end

      if fields.pmenu_header then
	 if fields.pmenu_header + 0 == 1 then
	    player:set_inventory_formspec(pbutton_form .. pinfo)
	 else
	    player:set_inventory_formspec(string.sub(pbutton_form, 1, -3) .. fields.pmenu_header .. "]" .. (pclasses.classes[pbuttons[fields.pmenu_header-1]].informations or "No informations available"))
	 end
	 return

      elseif fields.pmenu_leave then
	 player:set_inventory_formspec(pforms[player:get_player_name()])
	 pforms[player:get_player_name()] = nil
      end
end)

unified_inventory.register_button("pclasses", {
				  type = "image",
				  image = "pclasses_inv.png",
				  tooltip = "Player Classes Descriptions",
				  action = function(player)
				      if not pforms[player:get_player_name()] then
					 pforms[player:get_player_name()] = player:get_inventory_formspec()
					 player:set_inventory_formspec(pbutton_form .. pinfo)
				      end
				   end
})