-- Questo modulo contiene il codice per il template:Es-verb, che genera il paradigma con le forme base dei verbi spagnoli e potenzialmente ne permette la categorizzazzione per coniugazione

p = {}

local function categorizza(cat, titolo) --funzione per generare le categorie, by Wim_b
local NS = tostring(mw.title.getCurrentTitle().namespace);

	if NS == '0' then
		return string.format('[[%s:%s|%s]]', mw.site.namespaces[14].name, cat, titolo)
	else
		return ''
	end
end

function p.esverb(frame)
	pframe = frame:getParent()
    args = pframe.args

--inizializza tutte le stringhe come vuote, per facilitare la concatenazione
	sort = ""; rifl = ""; radice = ""; me = ""; se = ""
	conj = ""; conjdescr = ""; conjcat = ""; riflcat = ""
	pres1s = ""; pres1s2 = ""; prem1s = ""; prem1s2 = ""
	pp = ""; pp2 = ""; pp3 = ""; pp4 = ""; pp5 = ""
	riflink = ""; paradigma = ""; descrizione = ""
    
	titolo = mw.title.getCurrentTitle().text --il titolo della pagina (che dovrebbe corrispondere al verbo all'infinito)

--per prima cosa definisce la coniugazione; questo può avvenire con un parametro apposito oppure in automatico
	if args["conj"] ~= nil then --se è definito il parametro "conj" del template, la coniugazione è recuperata in base ad esso
		if args["conj"] == "1" then sort = "1"
		elseif args["conj"] == "2" then sort = "2"
		elseif args["conj"] == "3" then sort = "3"
		else error(" parametro 'conj' non ammesso! può essere solo '''1''', '''2''' o '''3''' (per prima, seconda o terza coniugazione)")
		end
	else --se il parametro "conj" del template non è definito, la coniugazione è recuperata in automatico in base alla terminazione dell'infinito
		if mw.ustring.sub(titolo, -2) == "ar" or mw.ustring.sub(titolo, -4) == "arse" then sort = "1"
		elseif mw.ustring.sub(titolo, -2) == "er" or mw.ustring.sub(titolo, -4) == "erse" then sort = "2"
		elseif mw.ustring.sub(titolo, -2) == "ir" or mw.ustring.sub(titolo, -4) == "irse" then sort = "3"
		else error(" terminazione del verbo non riconosciuta!")
		end
	end

--verifica se il verbo è riflessivo, ovvero se termina con la particella pronominale "se"
	if mw.ustring.sub(titolo, -2) == "se" then rifl = true else rifl = false end
	
--genera la radice del verbo, eliminando l'uscita all'infinito
	if rifl == false then radice = mw.ustring.sub(titolo, 1, -3)
	elseif rifl == true then radice = mw.ustring.sub(titolo, 1, -5)
	end

--genera le particelle pronominali se il verbo è riflessivo
	if rifl == true then
		me = "[[me#Spagnolo|me]] "
	end
	
--genera la descrizione (e potenzialmente la categoria) della coniugazione
	if sort == "1" then conj = "prima coniugazione"; conjdescr = "1<sup><small>a</small></sup> coniugazione"
	elseif sort == "2" then conj = "seconda coniugazione"; conjdescr = "2<sup><small>a</small></sup> coniugazione"
	elseif sort == "3" then conj = "terza coniugazione"; conjdescr = "3<sup><small>a</small></sup> coniugazione"
	end
	
--genera le categorie, per ora solo --commentate
	--conjcat = "categorizza("Verbi in spagnolo", titolo).. categorizza("Verbi di ".. conj.. " in spagnolo", titolo)"
	--if rifl == true then
		--riflcat = categorizza("Verbi riflessivi in spagnolo", titolo).. categorizza("Verbi riflessivi di ".. conj.. " in spagnolo", titolo)
	--else
		--riflcat = ""
	--end
		
--genera le forme flesse del paradigma
	if sort == "1" then
		pres1s = me.. p.wiki(radice.. "o"); prem1s = me.. p.wiki(radice.. "é"); pp = p.wiki(radice.. "ado")
	elseif sort == "2" or sort == "3" then
		pres1s = me.. p.wiki(radice.. "o"); prem1s = me.. p.wiki(radice.. "í"); pp = p.wiki(radice.. "ido")
	end
	
-- Recupera le eventuali forme irregolari o varianti, rimpiazziandole o aggiungendole a quelle standard
	pres1s = p.over(pres1s,args["pres1s"]); pres1s2 = p.wiki(args["pres1s2"])
	pres1s = p.alts(pres1s, pres1s2)
	prem1s = p.over(prem1s,args["prem1s"]); prem1s2 = p.wiki(args["prem1s2"])
	prem1s = p.alts(prem1s, prem1s2)
	pp = p.over(pp,args["pp"]); pp2 = p.wiki(args["pp2"]); pp3 = p.wiki(args["pp3"]); pp4 = p.wiki(args["pp4"]); pp5 = p.wiki(args["pp5"])
	pp = p.alts(pp, pp2); pp = p.alts(pp, pp3); pp = p.alts(pp, pp4); pp = p.alts(pp, pp5)

--genera il link al riflessivo, se questo esiste (e se il verbo non è riflessivo)
	if rifl == false then
		if mw.title.new(titolo.. "se").exists == true then
			riflink = "; ''riflessivo'': '''".. p.wiki(titolo.."se").. "'''"
		end
	end
	
--genera il paradigma, inserendo tra parentesi le voci verbali generate prima
	paradigma = "(''prima pers. sing. dell'indicativo presente'': '''".. pres1s.. "''', ''prima pers. sing. dell'indicativo preterito'': '''".. prem1s.. "''', ''participio passato'': '''".. pp.. "'''".. riflink.. ")"
	
--infine, mette insieme tutte le variabili generate fin qui nella stringa "descrizione", che costituisce l'output del modulo
	descrizione = conjdescr.. " ".. paradigma --.. conjcat.. riflcat
	
	return descrizione 
end

function p.over(x,over)
-- Utilizzato all'interno della funzione esverb
-- Rimpiazza una voce verbale standard con quella eventualmente indicata nel template (se quest'ultimo è un link rosso, aggiunge anche la relativa categoria)
    if over == nil then return x end
    if over < "a" then return 'n.e.' end
	if over >= "a" then
		return "[[" .. over .. "#Spagnolo|" .. over .. "]]"
	else 
		return "n.e."
	end
end

function p.wiki(x)
-- Utilizzato all'interno della funzione esverb
    if x == nil then return " " end
    if x == "" then return " " end
-- Rende il suo argomento un wikilink, o lo rende nullo se non definito (per facilitare la concatenazione)
    	return "[[" .. x .. "#Spagnolo|" .. x .. "]]"
end

function p.alts(x,y)
-- Utilizzato all'interno della funzione esverb
-- Aggiunge le eventuali forme alternative, se specificate nel template, separandole da quelle base con una virgola
	if y == nil then return x end
	if y == '' then return x end
    if y > "0" then return x .. " ''o'' " .. y end
    return x
end

return p