local S = minetest.get_translator("mail")
local has_canonical_name = minetest.get_modpath("canonical_name")

mail.register_on_player_receive(function(name, msg)
	-- add to inbox
	local entry = mail.get_storage_entry(name)
	table.insert(entry.inbox, msg)
	mail.set_storage_entry(name, entry)

	-- notify recipients that happen to be online
	local mail_alert = S("You have a new message from @1! Subject: @2",  msg.from, msg.subject) ..
	"\n" .. S("To view it, type /mail")
	local inventory_alert = S("You could also use the button in your inventory.")
	local player = minetest.get_player_by_name(name)
	if player then
		if mail.get_setting(name, "chat_notifications") == true then
			minetest.chat_send_player(name, mail_alert)
			if minetest.get_modpath("unified_inventory") or minetest.get_modpath("sfinv_buttons") then
				minetest.chat_send_player(name, inventory_alert)
			end
		end
		if mail.get_setting(name, "sound_notifications") == true then
			minetest.sound_play("mail_notif", {to_player=name})
		end
		local receiver_entry = mail.get_storage_entry(name)
		local receiver_messages = receiver_entry.inbox
		mail.hud_update(name, receiver_messages)
	end
end)

mail.register_recipient_handler(function(_, pname)
	if not minetest.player_exists(pname) then
		return nil
	end
	return true, function(msg)
		for _, on_player_receive in ipairs(mail.registered_on_player_receives) do
			if on_player_receive(pname, msg) then
				break
			end
		end
	end
end)

if has_canonical_name then
	mail.register_recipient_handler(function(_, name)
		local realname = canonical_name.get(name)
		if realname then
			return true, realname
		end
	end)
end