local S = minetest.get_translator("travelnet")

return function (node_info, fields, player)
	local player_name = player:get_player_name()

	-- does the player want to move this station one position up in the list?
	-- only the owner and players with the travelnet_attach priv can change the order of the list
	-- Note: With elevators, only the "G"(round) marking is actually moved
	if fields and (fields.move_up or fields.move_down)
		and not travelnet.is_falsey_string(node_info.props.owner_name)
		and (
			   (node_info.props.owner_name == player_name)
			or (minetest.get_player_privs(player_name)[travelnet.attach_priv])
		)
	then
		local travelnets = travelnet.get_travelnets(node_info.props.owner_name)
		local network = travelnets[node_info.props.station_network]

		if not network then
			return false, S("This station does not have a network.")
		end
		local stations = travelnet.get_ordered_stations(
			node_info.props.owner_name,
			node_info.props.station_network,
			node_info.props.is_elevator
		)

		local current_pos = -1
		for index, k in ipairs(stations) do
			if k == node_info.props.station_name then
				current_pos = index
				break
			end
		end

		local swap_with_pos
		if fields.move_up then
			swap_with_pos = current_pos-1
		else
			swap_with_pos = current_pos+1
		end

		-- handle errors
		if swap_with_pos < 1 then
			return false, S("This station is already the first one on the list.")
		elseif swap_with_pos > #stations then
			return false, S("This station is already the last one on the list.")
		else
			local current_station = stations[current_pos]
			local swap_with_station = stations[swap_with_pos]

			-- swap the actual data by which the stations are sorted
			local old_timestamp = network[swap_with_station].timestamp
			network[swap_with_station].timestamp = network[current_station].timestamp
			network[current_station].timestamp = old_timestamp

			-- for elevators, only the "G"(round) marking is moved; no point in swapping stations
			if not node_info.props.is_elevator then
				-- actually swap the stations
				stations[swap_with_pos] = current_station
				stations[current_pos]   = swap_with_station
			end

			-- store the changed order
			travelnet.log("action", "saving changed order for network '" .. node_info.props.station_network ..
				"' player '" .. node_info.props.owner_name .. "'")
			travelnet.set_travelnets(node_info.props.owner_name, travelnets)
			return true, { formspec = travelnet.formspecs.primary }
		end
	end
	return false, S("This @1 belongs to @2. You can't edit it.",
			node_info.props.description,
			tostring(node_info.props.owner_name)
		)
end
