require('Module:No globals')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local colore = require('Module:Partiti').colore

local function vrg(a,b,c)
	local s1, k
	local s2 = a or 0
	if (c == 1) then
		s1 = '<b>%s</b></td><td><b>%4.2f</b>'
	else
		s1 = '%s</td><td>%4.2f'
	end
	while true do
		s2, k = string.gsub(s2, "^(-?%d+)(%d%d%d)", '%1&nbsp;%2')
		if (k==0) then break end
	end
	s1 = string.format(s1, s2, 100*tonumber(a or 0)/b)
	s1 = s1:gsub('%.',',')
	s1 = '<td>' .. s1 .. '<div style="width:120px;background:#f0f0f0;border:1px solid #eee;height:3px"><div style="width:'..math.floor(120*tonumber(a or 0)/b)..'px;background:#007cc3;height:3px"></div></div></td>'
	return s1
end

local function colora(a,b,c)
	local clr = '#eee'
	if (a) then
		local x1 = string.find(a,'%[%[')
		if (x1) then
			local x2 = string.find(a:sub(x1),'%|')
			local x3 = string.find(a:sub(x1),'%]%]')
			if (x3) then
				if (x2) then
					a = a:sub(x1+2,x2-1)
				else
					a = a:sub(x1+2,x3-1)
				end
			end
		end
		clr = colore({a,(b or clr)})
	end
	return clr
end

function p.unico(frame)
	local args = getArgs(frame, {
		valueFunc = function (key, value)
			if type(key) == "number" then
				if value == nil then
					return nil
				else
					value = mw.text.trim(value)
				end
			else
				if value == '' then return nil end
			end
			return value
		end
	})
	local elettori = tonumber(args['elettori'] or 0)
	local elettori2 = tonumber(args['elettori2'] or elettori)
	local votanti = tonumber(args['votanti'] or 0)
	local votanti2 = tonumber(args['votanti2'] or 0)
	local ball = tonumber(args['ball1'] or 0)
	local titolo = args['titolo'] or ''
	local err = '-'
	local ss = ''
	local num = 0
	local tot,tot2 = 0,0

	ss = '<table class="wikitable" style="text-align:right;margin:10px auto"><caption>'..titolo..'</caption><tr><th rowspan=2>Candidato</th><th rowspan=2 colspan=2>Partito</th><th colspan=2>'
	if (ball>0) then ss= ss..'Primo turno</th><th colspan=2>Ballottaggio' else ss = ss..'Risultati' end
	ss = ss..'</tr><tr><th>Voti</th><th>%</th>'
	if (ball>0) then ss= ss..'<th>Voti</th><th>%</th>' end
	ss = ss..'</tr>'
	num = 1
	while (args['cand'..num]) do
		if (args['voti'..num]) then
			tot = tot+tonumber(args['voti'..num])
			tot2 = tot2+tonumber(args['ball'..num] or 0)
		else
			err = 'non indicato il numero di voti per il candidato '..num
		end
		num = num+1
	end
	if (votanti == 0 or elettori == 0) then err = 'non indicati elettori o votanti della votazione' end
	if (ball>0) then
		if (votanti2 == 0 or elettori2 == 0) then err = 'non indicati elettori o votanti del ballottaggio' end
	end
	num = num-1
	for i=1,num do
		if (i==1) then
			ss = ss..string.format('<tr><td align=left><b>%s</b></td><td style="width:8px;background:%s"> </td><td align=left>%s</td>', args['cand'..i], colora(args['part'..i],args['col'..i]), (args['part'..i] or '—'))
			if (ball>0) then
				ss = ss..vrg(args['voti'..i],tot,0)
				ss = ss..vrg(args['ball'..i],tot2,1)
			else
				ss = ss..vrg(args['voti'..i],tot,1)
			end
			ss = ss..'</tr>'
		else
			ss = ss..string.format('<tr><td align=left>%s</td><td style="width:8px;background:%s"> </td><td align=left>%s</td>', args['cand'..i], colora(args['part'..i],args['col'..i]), (args['part'..i] or '—'))
			ss = ss.. vrg(args['voti'..i],tot,0)
			if (args['ball'..i]) then ss = ss..vrg(args['ball'..i],tot2,0) end
			ss = ss..'</tr>'
		end
	end
	ss = ss..string.format('<tr><td colspan=%d></td></tr>', ball>0 and 7 or 5)
	ss = ss..'<tr><td colspan=3>Iscritti</td>'..vrg(elettori,elettori,0)
	if (ball>0) then ss = ss..vrg(elettori2,elettori2,0) end
	ss = ss..'</tr><tr><td colspan=3>Astenuti</td>'..vrg(elettori-votanti,elettori,0)
	if (ball>0) then ss = ss..vrg(elettori2-votanti2,elettori2,0) end
	ss = ss..'</tr><tr><td colspan=3>Votanti</td>'..vrg(votanti,elettori,0)
	if (ball>0) then ss = ss..vrg(votanti2,elettori2,0) end
	ss = ss..'</tr><tr><td colspan=3>Voti non validi</td>'..vrg(votanti-tot,votanti,0)
	if (ball>0) then ss = ss..vrg(votanti2-tot2,votanti2,0) end
	ss = ss..'</tr><tr><td colspan=3>Voti validi</td>'..vrg(tot,votanti,0)
	if (ball>0) then ss = ss..vrg(tot2,votanti2,0) end
	ss = ss..'</tr></table>'
	if (err == '-') then
		return ss
	else
		return '<p style="color:red"><b>Errore nel template:</b> '..err..'</p>'
	end
end

function p.poli(frame)
	local args = getArgs(frame, {
		valueFunc = function (key, value)
			if type(key) == "number" then
				if value == nil then
					return nil
				else
					value = mw.text.trim(value)
				end
			else
				if value == '' then return nil end
			end
			return value
		end
	})
	local elettori = tonumber(args['elettori'] or 0)
	local elettori2 = tonumber(args['elettori2'] or elettori)
	local votanti = tonumber(args['votanti'] or 0)
	local votanti2 = tonumber(args['votanti2'] or 0)
	local eletti = tonumber(args['eletti'] or 0)
	local ball = tonumber(args['ball1'] or 0)
	local titolo = args['titolo'] or ''
	local err = '-'
	local ss = ''
	local num = 0
	local tot,tot2 = 0,0

	ss = '<table class="wikitable" style="text-align:right;margin:10px auto"><caption>'..titolo..'</caption><tr><th rowspan=2>Candidato</th><th rowspan=2 colspan=2>Partito</th><th colspan=2>'
	if (ball>0) then ss= ss..'Primo turno</th><th colspan=2>Ballottaggio' else ss = ss..'Risultati' end
	ss = ss..'</th></tr><tr><th>Voti</th><th>%</th>'
	if (ball>0) then ss= ss..'<th>Voti</th><th>%</th>' end
	ss = ss..'</tr>'
	num = 1
	while (args['cand'..num]) do
		if (args['voti'..num]) then
			tot = tot+tonumber(args['voti'..num])
			tot2 = tot2+tonumber(args['ball'..num] or 0)
		else
			err = 'non indicato il numero di voti per il candidato '..num
		end
		num = num+1
	end
	if (votanti == 0 or elettori == 0 or eletti == 0) then err = 'non indicati elettori, votanti o eletti della votazione' end
	if (ball>0) then
		if (votanti2 == 0 or elettori2 == 0) then err = 'non indicati elettori o votanti del ballottaggio' end
	end
	num = num-1
	for i=1,num do
		if (i<=eletti) then
			ss = ss..string.format('<tr><td align=left><b>%s</b></td><td style="width:8px;background:%s"> </td><td align=left>%s</td>', args['cand'..i], colora(args['part'..i],args['col'..i]), (args['part'..i] or '—'))
			if (ball>0) then
				ss = ss..vrg(args['voti'..i],votanti,0)
				ss = ss..vrg(args['ball'..i],votanti2,1)
			else
				ss = ss..vrg(args['voti'..i],votanti,1)
			end
			ss =ss..'</tr>'
		else
			ss = ss..string.format('<tr><td align=left>%s</td><td style="width:8px;background:%s"> </td><td align=left>%s</td>', args['cand'..i], colora(args['part'..i],args['col'..i]), (args['part'..i] or '—'))
			ss = ss..vrg(args['voti'..i],votanti,0)
			if (args['ball'..i]) then ss = ss..vrg(args['ball'..i],votanti2,0) end
			ss = ss..'</tr>'
		end
	end
	ss = ss..string.format('<tr><td colspan=%d></td></tr>', ball>0 and 7 or 5)
	ss = ss..'<tr><td colspan=3>Iscritti</td>'..vrg(elettori,elettori,0)
	if (ball>0) then ss = ss..vrg(elettori2,elettori2,0) end
	ss = ss..'</tr><tr><td colspan=3>Astenuti</td>'..vrg(elettori-votanti,elettori,0)
	if (ball>0) then ss = ss..vrg(elettori2-votanti2,elettori2,0) end
	ss = ss..'</tr><tr><td colspan=3>Votanti</td>'..vrg(votanti,elettori,0)
	if (ball>0) then ss = ss..vrg(votanti2,elettori2,0) end
	ss = ss..'</tr></table>'
	if (err == '-') then
		return ss
	else
		return '<p style="color:red"><b>Errore nel template:</b> '..err..'</p>'
	end
end

function p.lista(frame)
	local args = getArgs(frame, {
		valueFunc = function (key, value)
			if type(key) == "number" then
				if value == nil then
					return nil
				else
					value = mw.text.trim(value)
				end
			else
				if value == '' then return nil end
			end
			return value
		end
	})
	local elettori = tonumber(args['elettori'] or 0)
	local elettori2 = tonumber(args['elettori2'] or elettori)
	local votanti = tonumber(args['votanti'] or 0)
	local votanti2 = tonumber(args['votanti2'] or 0)
	local ball = tonumber(args['ball1'] or 0)
	local titolo = args['titolo'] or ''
	local err = '-'
	local ss = ''
	local num = 0
	local tot,tot2 = 0,0

	ss = '<table cellpadding=0 cellspacing=0 style="border-collapse:collapse;margin:10px auto"><caption><b>'..titolo..'</b><tr style="vertical-align:top"><td>'
	ss = ss..'<table class="wikitable" style="text-align:right"><tr><th rowspan=2 colspan=2>Partito</th><th colspan=2>'
	if (ball>0) then ss= ss..'Primo turno</th><th colspan=2>Ballottaggio</th>' else ss = ss..'Risultati</th>' end
	ss = ss..'<th rowspan=2>Seggi</th></tr>'
	ss = ss..'<tr><th>Voti</th><th>%</th>'
	if (ball>0) then ss= ss..'<th>Voti</th><th>%</th>' end
	ss = ss..'</tr>'
	num = 1
	while (args['part'..num]) do
		if (args['voti'..num]) then
			tot = tot+tonumber(args['voti'..num])
			tot2 = tot2+tonumber(args['ball'..num] or 0)
		else
			err = 'non indicato il numero di voti per il partito '..num
			end
		num = num+1
	end
	if (ball>0) then
		if (votanti2 == 0 or elettori2 == 0) then
			err = 'non indicati elettori o votanti del ballottaggio'
		end
	end
	num = num-1
	for i=1,num do
		ss = ss..string.format('<tr><td style="width:8px;background:%s"></td><td align=left>%s</td>', colora(args['part'..i],args['col'..i]), args['part'..i])
		ss = ss..vrg(args['voti'..i],tot,0)
		if (ball>0) then
			if (args['ball'..i]) then ss = ss..vrg(args['ball'..i],tot2,0) else ss=ss..'<td></td><td></td>' end
		end
		ss = ss..'<td>'..(args['seggi'..i] or '')..'</td></tr>'
	end
	ss = ss..string.format('<tr><td colspan=%d></td></tr>',ball>0 and 7 or 5)
	ss = ss..'<tr><td colspan=2>Iscritti</td>'..vrg(elettori,elettori,0)
	if (ball>0) then ss = ss..vrg(elettori2,elettori2,0) end
	ss = ss..'</tr><tr><td colspan=2>Astenuti</td>'..vrg(elettori-votanti,elettori,0)
	if (ball>0) then ss = ss..vrg(elettori2-votanti2,elettori2,0) end
	ss = ss..'</tr><tr><td colspan=2>Votanti</td>'..vrg(votanti,elettori,0)
	if (ball>0) then ss = ss..vrg(votanti2,elettori2,0) end
	ss = ss..'</tr><tr><td colspan=2>Voti non validi</td>'..vrg(votanti-tot,votanti,0)
	if (ball>0) then ss = ss..vrg(votanti2-tot2,votanti2,0) end
	ss = ss..'</tr><tr><td colspan=2>Voti validi</td>'..vrg(tot,votanti,0)
	if (ball>0) then ss = ss..vrg(tot2,votanti2,0) end
	ss = ss..'</tr></table></td><td width="12px"></td><td><table class="wikitable"><tr><th colspan=2>Eletti</th></tr>'
	num = 1
	while (args['el'..num]) do
		ss = ss..string.format('<tr><td style="background:%s"> </td><td>%s</td></tr>',colora(args['part el'..num],args['col'..num]), args['el'..num])
		num = num+1
	end
	ss = ss..'</table></td></tr></table>'
	if (err == '-') then
		return ss
	else
		return '<p style="color:red"><b>Errore nel template:</b> '..err..'</p>'
	end
end

return p