local station = stairsplus.api.station

function invsaw.initialize_inventory(player)
	local meta = player:get_meta()
	local inv = player:get_inventory()

	station.initialize_metadata(meta, inv, { "legacy" })
	station.initialize_inventory(inv, { "legacy" })
end

function invsaw.drop_inventory(player)
	local pos = player:get_pos()
	local inv = player:get_inventory()
	for _, listname in ipairs({ "stairsplus:input", "stairsplus:micro", "stairsplus:recycle" }) do
		for i = 1, inv:get_size(listname) do
			local item = inv:get_stack(listname, i)
			if not item:is_empty() then
				minetest.add_item(pos, item)
			end
		end
		inv:set_size(listname, 0)
	end
	inv:set_size("stairsplus:output", 0)
end

local function is_stairsplus_inventory(listname)
	return (
		listname == "stairsplus:input"
		or listname == "stairsplus:micro"
		or listname == "stairsplus:recycle"
		or listname == "stairsplus:output"
	)
end

minetest.register_allow_player_inventory_action(function(player, action, inv, info)
	local meta = player:get_meta()
	if action == "move" then
		local from_is_stairsplus = is_stairsplus_inventory(info.from_list)
		local to_is_stairsplus = is_stairsplus_inventory(info.to_list)
		if from_is_stairsplus and to_is_stairsplus then
			return station.allow_inventory_move(
				meta,
				inv,
				info.from_list,
				info.from_index,
				info.to_list,
				info.to_index,
				info.count,
				player
			)
		elseif to_is_stairsplus then
			local stack = inv:get_stack(info.from_list, info.from_index)
			return station.allow_inventory_put(meta, inv, info.to_list, info.to_index, stack, player)
		end
	elseif action == "put" and is_stairsplus_inventory(info.listname) then
		return station.allow_inventory_put(meta, inv, info.listname, info.index, info.stack, player)
	end
end)

minetest.register_on_player_inventory_action(function(player, action, inv, info)
	local meta = player:get_meta()
	if action == "move" and is_stairsplus_inventory(info.from_list) and not is_stairsplus_inventory(info.to_list) then
		local stack = inv:get_stack(info.to_list, info.to_index)
		stack:set_count(info.count)
		station.on_inventory_take(meta, inv, info.from_list, info.from_index, stack, player)
	elseif
		action == "move"
		and not is_stairsplus_inventory(info.from_list)
		and is_stairsplus_inventory(info.to_list)
	then
		local stack = inv:get_stack(info.from_list, info.from_index)
		station.on_inventory_put(meta, inv, info.to_list, info.to_index, stack, player)
	elseif action == "put" and is_stairsplus_inventory(info.listname) then
		station.on_inventory_put(meta, inv, info.listname, info.index, info.stack, player)
	elseif action == "take" and is_stairsplus_inventory(info.listname) then
		station.on_inventory_take(meta, inv, info.listname, info.index, info.stack, player)
	end
end)
