local p = {}
local getArgs = require('Modulo:Arguments').getArgs
local tabella = mw.loadData('Modulo:RisMoto/Stagioni')
local tabgp = mw.loadData('Modulo:RisMoto/GP')

local tavolozza = {
["1"] = "FFFFBF",
["2"] = "DFDFDF",
["3"] = "FFDF9F",
punti = "DFFFDF",
nopunti = "CFCFFF",
NC = "CFCFFF",
Rit = "EFCFFF",
SQ = "000000; color:white; font-size:81%",
NP = "FFCFCF",
NQ = "FFCFCF",
NE = "F0FFFF",
SP = "F1F8FF",
TP = "F1F8FF",
AN = "F0FFFF",
["0"] = ""
}

--La funzione determina il colore delle celle contenenti i risultati, dati il numero di piloti in zona punti come primo argomento e il risultato come secondo argomento.
function p.colori(frame)
	local args = getArgs(frame)
	local zonapunti = tonumber(args[1])
	local ris = args[2]

	if not ris or string.lower(ris) == "inf" then
		ris = 0
	end

	ris = string.gsub(ris,"'","")

	if tonumber(ris) and tonumber(ris) > 3 then
   		if tonumber(ris) <= zonapunti then
   			ris = "punti"
   		else ris = "nopunti"
   		end
	end

	local colore = tavolozza[ris]

	colore = colore or ""

	return "style=\"padding-left:0px;padding-right:0px;background-color:#" .. colore .. "\""
end

--La funzione applica il grassetto e/o il corsivo ai risultati a seconda del valore dei parametri Gn, dati il risultato come primo argomento e il valore di Gn come secondo argomento.
function p.ppgv(frame)
	local args = getArgs(frame)
	local ris = args[1]
	local apici = args[2]

	local switch = {["PG"]="'''''",["PP"]="'''",["GV"]="''"}

	if ris then
		if switch[apici] then
			ris = switch[apici] .. ris .. switch[apici]
		end
	else ris = ""
	end

	return ris

end

--La funzione restituisce una serie di celle contenenti le bandierine dei Gran Premi effettuati nell'anno definito come unico argomento. Le singole bandierine vengono generate dalla funzione band.
function p.sequenza(frame)

	local anno = tonumber(frame.args[1])
	local annoN = anno or 0
	local classe = frame.args[2] or ""
	local indici = p.motoe({classe}) 
	local gare = indici[1]
	local gp = indici[2]
	local prima = indici[3]

	anno = (p.ultima() >= annoN and annoN >= prima) and anno or "default"

	local dati = tabella[anno]
	local seq = dati[gp]
	local gareanno = dati[gare]
	local str = ''

	if classe ~= "MotoE" and (classe == "MotoGP" and anno < 2023) then
		str = 'width=3%|' .. p.band({seq[1],anno})

		for i = 2,gareanno do
			str = str .. '||width=3%|' .. p.band({seq[i],anno})
		end
	elseif classe == "MotoGP" then
		str = 'colspan=2 width=3%|' .. p.band({seq[1],anno})

		for i = 2,gareanno do
			str = str .. '||colspan=2 width=3%|' .. p.band({seq[i],anno})
		end
	else
		for i, g in ipairs(seq) do
			col = ' colspan=' .. (string.match(g,"_(%d)") or 1)
			gara = string.gsub(g,"_%d","")
			if i ~= 1 then
				str = str .. '||width=3%' .. col .. '|' .. p.band({gara,anno})
			else
				str = str .. 'width=3%' .. col .. '|' .. p.band({gara,anno})
			end
		end
	end

	return str

end

--La funzione restituisce una serie di celle vuote, il cui numero dipende da due parametri passati tramite template: il parametro |Anno= e uno tra |Colonne= (il totale desiderato di caselle colorabili e vuote) e |Ritiro= (l'ultimo anno di attività).
function p.vuote(frame)

	local argstmp = mw.getCurrentFrame():getParent().args
	local anno = tonumber(argstmp["Anno"]) or tonumber(argstmp[1])
	local ritiro = tonumber(argstmp["Ritiro"])
	local colonne = tonumber(argstmp["Colonne"])
	local classe = argstmp["Classe"] or ""
	local str = ""
	local annoN = anno or 0
	local indici = p.motoe({classe})
	local gare = indici[1]
	local prima = indici[3]

	anno = (p.ultima() >= annoN and annoN >= prima) and anno or "default"

	local dati = tabella[anno]
	local gareanno = 0
	local max = p.max({[2]=classe})/indici[4]

	for _ in pairs(dati[indici[2]]) do gareanno = gareanno + 1 end

	if colonne and colonne >= gareanno and colonne <= max then
		max = colonne
	elseif ritiro and ritiro >= annoN then
		max = p.max({ritiro,classe})
	end

	for i=1,(max-gareanno) do
		str = str .. "||width=3%|&#32;"
	end

	return str

end

--La funzione restituisce una serie di celle a seconda dell'anno e dei risultati che sono stati passati come parametri all'interno dei template. Il numero di celle dipende dall'anno e la loro formattazione viene determinata elaborando i parametri tramite le funzioni colori e ppgv.
function p.celle(frame)
	local argstmp = mw.getCurrentFrame():getParent().args
	local args = getArgs(frame)
	local str = ""
	local anno = tonumber(argstmp["Anno"])
	local annoN = anno or 0
	local classe = argstmp["Classe"] or ""

	local indici = p.motoe({classe})
	local gare = indici[1]
	local prima = indici[3]

	anno = (p.ultima() >= annoN and annoN >= prima) and anno or "default"

	local dati = tabella[anno]
	local gare = dati[gare]
	local zonapunti = tabella[anno].punti

	local lettera = args[1]
	local ris = ""
	
	if classe == "MotoGP" and anno > 2022 then
		gare = gare * 2
	end

	for i=1,gare do
		local zonapunti = tabella[anno].punti
		if not lettera or lettera == "" then
			paramR = i .. "R"
			paramG = "G" .. i
			paramN = "N" .. i
			ris = p.ppgv({argstmp[paramR],argstmp[paramG]})
		else
			paramR = lettera .. i
			paramN = "N" .. lettera .. i
			ris = argstmp[paramR]
		end
		if classe == "MotoGP" and anno > 2022 and i % 2 == 1 then
			zonapunti = 9
		end
		local col = p.colori({zonapunti,argstmp[paramR]})
		local note = argstmp[paramN]
		ris = ris or ""
		note = note or ""
		if i~=1 then
			str = str .. '||'
		end
		str = str .. col .. "|&#32;" .. ris .. note
	end

	return str

end

--La funzione restituisce il numero massimo di gare disputate in una stagione fino all'anno dato come unico argomento; in assenza dell'argomento, la funzione calcola il massimo assoluto.
function p.max(frame)
	local args = getArgs(frame)
	local ritiro = tonumber(args[1])
	local classe = args[2]
	local max = 6
	local ultima = p.ultima()
	local indici = p.motoe({classe})
	local gare = indici[1]
	local prima = indici[3]

	if not ritiro or ritiro > ultima then
		ritiro = ultima
	end

	for i = prima,ritiro do
		local dati = tabella[i]
		local gare = dati[gare]
		max = (gare > max) and gare or max
	end

	return max

end

--La funzione genera la bandierina con link ai Gran Premi, dati il codice del GP come primo argomento e l'anno come secondo argomento facoltativo.
function p.band(frame)
	local args = getArgs(frame)
	local gp = args[1]
	local anno = args[2]
	local dati = tabgp[gp]
	local str = ""

	dati = dati or tabgp["NC"]

	if not anno then
		anno = ""
	else anno = " " .. anno
	end

	str = str .. '[[File:' .. dati["file"] .. '|18px|border|link=' .. dati["nome"] .. anno .. ']]'

	return str

end

--La funzione, chiamata esclusivamente dal template:Rapporto gara motomondiale, restituisce le gare effettuate durante l'anno, passato come parametro Anno_di_gara nel template.
function p.gareanno(frame)
	local argstmp = frame:getParent().args
	local anno = tonumber(argstmp["Anno_di_gara"])
	local stagione = tabella[anno]
	local gareanno = p.max()
	if stagione then
		gareanno = stagione["gare"]
	end
	return gareanno
end

--La funzione crea parte della tabella del template:RisMotoTeam, in particolare le righe con i risultati dei singoli piloti (con un limite massimo di 10, espandibile se necessario), leggendo i parametri inseriti direttamente nel template.
function p.team(frame)
	local argstmp = mw.getCurrentFrame():getParent().args
	local numero = tonumber(argstmp[1])
	local numeroN = numero or 1
	numero = (numeroN < 10) and numeroN or 10
	local lettera = {string.char(65)}
	local pilota = argstmp["P1"]
	local punti = argstmp["Punti"]
	local pos = argstmp["Pos"]
	local rowspan = "||rowspan=" .. numero

	if not punti or punti == "" then
		punti = " "
	end

	pilota = pilota or " "

	if not pos then
		pos = "| "
	elseif tonumber(pos) == 1 then
		pos = ' bgcolor="#FFFFBF"|' .. pos .. "º"
	elseif tonumber(pos) then
		pos = "|" .. pos .. "º"
	else pos = "|" .. pos
	end

	local output = pilota .. "||" ..  p.celle(lettera) .. p.vuote() .. rowspan .. "|" .. punti .. rowspan .. pos .. "\n|-\n"

	for i=2,numero do
		lettera = {string.char(i+64)}
		pilota = argstmp["P" .. i]
		pilota = pilota or " "
		output = output .. "|" .. pilota .. "||" .. p.celle(lettera) .. p.vuote() .. "\n|-\n"
	end

	return output

end

--La funzione crea parte della tabella del template:RisMotoTeam2, in particolare le righe con i risultati dei singoli piloti (con un limite massimo di 10, espandibile se necessario), leggendo i parametri inseriti direttamente nel template.
function p.team2(frame)
	local argstmp = mw.getCurrentFrame():getParent().args
	local numero = tonumber(argstmp[1])
	local numeroN = numero or 1
	numero = (numeroN < 10) and numeroN or 10
	local lettera = {string.char(65)}
	local pilota = argstmp["P1"]
	local punti = argstmp["Punti"]
	local rowspan = "||rowspan=" .. numero

	if not punti or punti == "" then
		punti = " "
	end

	pilota = pilota or " "

	local output = "align=left|" ..pilota .. "||" ..  p.celle(lettera) .. rowspan .. " align=right|" .. punti .."\n|-\n"

	for i=2,numero do
		lettera = {string.char(i+64)}
		pilota = argstmp["P" .. i]
		pilota = pilota or " "
		output = output .. "|align=left|" .. pilota .. "||" .. p.celle(lettera) .. "\n|-\n"
	end

	return output

end
	
--La funzione aggiunge la legenda in fondo alle tabelle dei risultati.
function p.legenda(frame)
	local args = getArgs(frame, {wrappers = {'Template:RisMoto','Template:RisMotoTeam'}})
	local dim = args["dim"] or 85
	local anno = tonumber(args["Anno"]) or 0
	if args["LEG"] == "1" then
		return "{| class=\"wikitable\" style=\"text-align:center; width: 100%; font-size:" .. dim .. "%; margin-top: 0em; margin-bottom: 0em; padding:0\"\n|-\n|rowspan=2 width=5%|'''Legenda'''||style=\"background-color:#ffffbf;width:15%\"|1º posto||style=\"background-color:#dfdfdf;width:15%\"|2º posto||style=\"background-color:#ffdf9f;width:15%\"|3º posto||style=\"background-color:#dfffdf;width:15%\"|A punti||style=\"background-color:#cfcfff;width:15%\"|Senza punti||rowspan=2 style=\"background-color:#ffffff;width:20%\"|'''Grassetto''' – Pole position<br/>''Corsivo'' – Giro più veloce\n|-\n|style=\"background-color:#f0ffff\"|Gara non valida||style=\"background-color:#ffcfcf\"|Non qual./Non part.||style=\"background-color:#efcfff\"|Ritirato/Non class.||style=\"background-color:#000000; color:white\"|Squalificato||style=\"background-color:#FAFAFA\"|'-' Dato non disp.\n|}"
	end

end

--La funzione determina la stagione più recente di cui sono presenti dati in Modulo:RisMoto/Stagioni.
function p.ultima(frame)
	local ultima = 1949
	while tabella[ultima] do
		ultima = ultima + 1
	end
	ultima = ultima - 1
	return ultima
end

function p.classe(frame)
	local args = getArgs(frame)
	local classe = args[1]
	local classi = {["50"]="[[Classe 50|50]]",["80"]="[[Classe 80|80]]",["125"]="[[Classe 125|125]]",["250"]="[[Classe 250|250]]",["350"]="[[Classe 350|350]]",["500"]="[[Classe 500|500]]",["Sidecar"]="[[Classe sidecar|Sidecar]]",["MotoGP"]="[[MotoGP]]",["Moto2"]="[[Moto2]]",["Moto3"]="[[Moto3]]",["MotoE"]="[[MotoE]]"}
	local output = classi[classe] or classe
	return output
end

--La funzione controlla se la classe è la MotoE in modo che le altre funzioni possano ricavare i dati relativi a questa classe.
function p.motoe(frame)
	local args = getArgs(frame)
	local classe = args[1]
	local indici = {"gare","gp",1949,1}
	if classe == "MotoE" then
		indici = {"gareE","gpE",2019,2}
	end

	return indici
end

return p