-- translation
local S = minetest.get_translator("mail")

local FORMNAME = "mail:selectcontact"

local select_contact_formspec = "size[8,9;]" .. mail.theme .. [[
    tablecolumns[color;text;text]
    table[0,0;3.5,9;contacts;#999,]] .. S("Name") .. "," .. S("Note") .. [[%s]
    button[3.55,2.00;1.75,0.5;toadd;→ ]] .. S("Add") .. [[]
    button[3.55,2.75;1.75,0.5;toremove;← ]] .. S("Remove") .. [[]
    button[3.55,6.00;1.75,0.5;ccadd;→ ]] .. S("Add") .. [[]
    button[3.55,6.75;1.75,0.5;ccremove;← ]] .. S("Remove") .. [[]
    tablecolumns[color;text;text]
    table[5.15,0.0;2.75,4.5;to;#999,]] .. S("To") .. ":," .. S("Note") .. [[%s]
    tablecolumns[color;text;text]
    table[5.15,4.6;2.75,4.5;cc;#999,]] .. S("CC") .. ":," .. S("Note") .. [[%s]
    button[3.55,8.25;1.75,0.5;back;]] .. S("Back") .. [[]
]]


function mail.show_select_contact(name, to, cc)
	local formspec = select_contact_formspec
	local contacts = mail.compile_contact_list(name, mail.selected_idxs.contacts[name])

	-- compile lists
	if to then
		to = mail.compile_contact_list(name, mail.selected_idxs.to[name], to)
	else
		to = ""
	end
	if cc then
		cc = mail.compile_contact_list(name, mail.selected_idxs.cc[name], cc)
	else
		cc = ""
	end
	--[[if bcc then
		bcc = table.concat(mail.compile_contact_list(name, mail.selected_idxs.bcc[name], bcc)
	else
		bcc = ""
	end]]--
	formspec = string.format(formspec, contacts, to, cc)--, bcc()
	minetest.show_formspec(name, FORMNAME, formspec)
end

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

	local name = player:get_player_name()
	local contacts = mail.get_contacts(name)
	local draft = mail.message_drafts[name]

	-- get indexes for fields with selected rows
	-- execute their default button's actions if double clicked
	for k,action in pairs({
		contacts = "toadd",
		to = "toremove",
		cc = "ccremove",
		bcc = "bccremove"
	}) do
		if fields[k] then
			local evt = minetest.explode_table_event(fields[k])
			mail.selected_idxs[k][name] = evt.row - 1
			if evt.type == "DCL" and mail.selected_idxs[k][name] then
				fields[action] = true
			end
			return true
		end
	end

	local update = false
	-- add
	for _,v in pairs({"to","cc","bcc"}) do
		if fields[v.."add"] then
			update = true
			if mail.selected_idxs.contacts[name] then
				for k, contact, i in mail.pairsByKeys(contacts) do
					if k == mail.selected_idxs.contacts[name] or i == mail.selected_idxs.contacts[name] then
						local list = mail.parse_player_list(draft[v])
						list[#list+1] = contact.name
						mail.selected_idxs[v][name] = #list
						draft[v] = mail.concat_player_list(list)
						break
					end
				end
			end
		end
	end
	-- remove
	for _,v in pairs({"to","cc","bcc"}) do
		if fields[v.."remove"] then
			update = true
			if mail.selected_idxs[v][name] then
				local list = mail.parse_player_list(draft[v])
				table.remove(list, mail.selected_idxs[v][name])
				if #list < mail.selected_idxs[v][name] then
					mail.selected_idxs[v][name] = #list
				end
				draft[v] = mail.concat_player_list(list)
			end
		end
	end

	if update then
		mail.show_select_contact(name, draft.to, draft.cc, draft.bcc)
		return true
	end

	-- delete old idxs
	for _,v in ipairs({"contacts","to","cc","bcc"}) do
		mail.selected_idxs[v][name] = nil
	end

	mail.show_compose(name, draft.to, draft.subject, draft.body, draft.cc, draft.bcc)

	return true
end)