local broomstick_time = 120 -- Seconds
local broomstick_mana = 190
local broomstick_actual_users = {}
local had_fly_privilege = {}
local privs = {}

-- broomstick file
users_file = minetest.get_worldpath() .. "/broomstick_users.txt"
--load broomstick  file
local file = io.open(users_file, "r")
if file then
	had_fly_privilege = minetest.deserialize(file:read("*all"))
	file:close()
	file = nil
	if not had_fly_privilege or type(had_fly_privilege) ~= "table" then
		had_fly_privilege = {}
	end
else
	minetest.log("error", "[broomstick] Can not open broomstick_users.txt file !")
end


-- funtion save broomstick  file
local function save()
	local input = io.open(users_file, "w")
	if input then
		input:write(minetest.serialize(had_fly_privilege))
		input:close()
	else
		minetest.log("error","[broomstick] Open failed (mode:w) of " .. users_file)
	end
end

-- on join_player remove priv fly
minetest.register_on_joinplayer(function(player)
	local playername = player:get_player_name()
	if had_fly_privilege[playername] ~= nil then
		privs = minetest.get_player_privs(playername)
		privs.fly = nil
		minetest.set_player_privs(playername, privs)
		had_fly_privilege[playername] = nil
		save()
	end
end)

-- Broomstick timer
local function broomstick_end(playername)
	minetest.chat_send_player(playername, "WARNING ! You'll fall in 10 seconds !")
	minetest.after(10, function(playername)
		-- Send a message...
		minetest.chat_send_player(playername, "End of broomstick. I hope you're not falling down...")
		-- Set player privs...
		privs = minetest.get_player_privs(playername)
		privs["fly"] = nil
		minetest.set_player_privs(playername, privs)
		-- Remove the player in the list.
		for i = 1, #broomstick_actual_users do
			if broomstick_actual_users[i] == playername then
				table.remove(broomstick_actual_users, i)
			end
		end
		-- Rewrite the broomstick_users.txt file.
		had_fly_privilege[playername] = nil
		save()
	end, playername)
end

-- Register broomstick
minetest.register_craftitem("broomstick:broomstick", {
	description = "Broomstick",
	inventory_image = "broomstick.png",
	stack_max = 1,
	on_use = function(itemstack, user, pointed_thing)
		local playername = user:get_player_name()
		if mana.get(playername) >= broomstick_mana then
			local has_already_a_broomstick = false
			for i = 1, #broomstick_actual_users do
				if broomstick_actual_users[i] == playername then
					has_already_a_broomstick = true
				end
			end
			if not has_already_a_broomstick then
				privs = minetest.get_player_privs(playername)
				-- Set player privs...
				if not privs.fly == true then
					-- Rewrite the broomstick_users.txt file.
					had_fly_privilege[playername] = true
					save()
					privs.fly = true
					minetest.set_player_privs(playername, privs)
				else
					minetest.chat_send_player(playername, "You known you can fly by yourself, don't you?")
					return
				end
				-- Send a message...
				minetest.chat_send_player(playername, "You can now fly during " .. tostring(broomstick_time) .. " seconds.")
				minetest.log("action", "Player " .. playername .. " has use a broomstick.")
				-- Subtract mana...
				mana.subtract(playername, broomstick_mana)
				-- Insert player in the list.
				table.insert(broomstick_actual_users, playername)
				-- And add the function in queue
				minetest.after(broomstick_time-10, broomstick_end, playername)
				-- Remove broomstick.
				return ItemStack("")
			else
				minetest.chat_send_player(playername, "You already have a broomstick ! Please wait until the end of your actual broomstick.")
			end
		else
			minetest.chat_send_player(playername, "You must have " .. tostring(broomstick_mana) .. " of mana to use a broomstick !")
		end
	end,
})

-- Craft
minetest.register_craft({
	output = "broomstick:broomstick",
	recipe = {{"","","farming:string",},
		{"default:stick","default:stick","mobs:minotaur_lots_of_fur",},
		{"","","farming:string",},},
})


minetest.log("info", "[OK] broomstick")