local getArgs = require('Modulo:Arguments').getArgs
local args = getArgs(frame)
local titolo = mw.title.getCurrentTitle().subpageText
local pRegex = "^[b|n|q|s|v|w|voy]" -- Regex per i progetti accettati


prog_etichetta = { -- testo da visualizzare nel link
	b = "testi",
	n = "news",
	q = "citazioni",
	s = "opere",
	v = "corsi",
	w = "approfondimento",
	voy = "itinerari",
}

prog_img = { -- titolo dell'immagine per progetto (senza la parte "-logo.ext")
	b = "Wikibooks",
	n = "Wikinews",
	q = "Wikiquote",
	s = "Wikisource",
	v = "Wikiversity",
	w = "Wikipedia",
	voy = "Wikivoyage",
}

progetti = { -- per adesso non serve ma in futuro potrebbe essere motivo di update
	prog_etichetta = {},
	prog_img = {},
}

-- Funzione per confrontare una regex con il parametro passato
 local function pPattern (par)
 	return string.match ( pRegex , par)
 end
 
-- FUNZIONE PER CATEGORIZZARE IN CASO DI APPENDICE NON ESISTENTE
local function categorizza(pagina,lingua)
	if mw.title.new(pagina).exists == false then
		return string.format('[[Category:%s]]', 'Appendici in '.. lingua:lower() ..' da scrivere') 
	else
		return ''
	end
end

--[[ FUNZIONE PER GESTIRE CATEGORIZZAZIONE E MESSAGGIO DI ERRORE
(LE VARIE CONDIZIONI NECESSARIE AL FUNZIONAMENTO SONO SPECIFICATE ALL'INTERNO
DELLA FUNZIONE Errore(), QUESTA FUNZIONE GESTISCE SOLTANTO IL RISULTATO) ]]--

local function ErroreMSG (ErrParametro)
	local ErrMessaggio = '&nbsp;<strong class="error">Parametro "<u>'.. ErrParametro ..'</u>" non riconosciuto</strong>'
	local ErrCategoria = '[[Category:Template Pn con parametri errati]]'
		return ErrMessaggio .. '' .. ErrCategoria
	end


-- FUNZIONE PER GESTIRE LA SCELTA DELL'EVENTUALE MESSAGGIO DI ERRORE PER
-- "CODICE PROGETTO ERRATO"

local function Errore (frame)
local args = getArgs(frame)
local tErr = ''	

	for i, j in pairs(args) do
		-- MESSAGGIO DI ERRORE (E CATEGORIZZAZIONE) PER CODICE PROGETTO ERRATO
		if (i ~= pPattern (i) and i ~= 'lin' and i ~= 'c' and j ~= pPattern (j)  and j ~= 'lin' and j ~= 'c') then		
			if type(i) ~= 'number' then
				tErr = ErroreMSG(i)
			else
				tErr = ErroreMSG(j)
			end
		end
	end
	
	return tErr
end

-- FUNZIONE PER GESTIRE IL TESTO E IL LINK AL PROGETTO WMF
local function LinkProgetto(frame)
	local args = getArgs(frame)
	local tProg = ''	

	for i, j in pairs(args) do
		-- Valore specificato per il parametro
		if type(i) ~= 'number' and i ~= 'c' or args['lin'] ~= nil then
			local img = (mw.ustring.gsub(i, '^[%a]+', prog_img))
			local etichetta = (mw.ustring.gsub(i, '^[%a]+', prog_etichetta))
			
			if i == pPattern (i) then -- Testo per un valore "pagina - progetto" diverso da quello di default
				tProg = "&nbsp;([[File:".. img .."-logo.svg|20px|".. img .."]] '''[["..i..":"..j.."|".. etichetta .."]]''')"
			end
		end
		
		-- Valore NON specificato per il parametro
		if j ~= nil and j ~= 'c' or  args['lin'] ~= nil then
			local img = (mw.ustring.gsub(j, '^[%a]+', prog_img))
			local etichetta = (mw.ustring.gsub(j, '^[%a]+', prog_etichetta))
			
			if j == pPattern (j) then -- Testo per un valore "pagina - progetto" uguale a quello di default
				tProg = "&nbsp;([[File:".. img .."-logo.svg|20px|".. img .."]] '''[["..j..":"..titolo.."|".. etichetta .."]]''')"
			end
		end
	end
	
	return tProg
end

-- FUNZIONE PER GESTIRE IL TESTO E IL LINK ALLA CONIUGAZIONE
local function LinkConiugazione(frame)
	local args = getArgs(frame)
	local coniugazione = ''
	local cat_coniugazione = ''
	local tCong = ''
	local SwitchLang = mw.language.fetchLanguageName( (args['c'] or args['lin'] or 'it'), 'it' )
	
		--[[ controlla che la funzione "mw.language.fetchLanguageName" non dia un 
		parametro vuoto. in caso affermativo vuol dire che il codice ISO 
		della lingua non è stato riconosciuto e quindi lo script salta del tutto
		la visualizzazione del link alla coniugazione e va direttamente al messaggio
		di errore con relativa categoria--]]
		
			for i, j in pairs(args) do
				 -- Controlla se è stato specificato il parametro "c"…
				if i == 'c' or j == 'c' or args['c'] ~= nil then
					-- … e che se è stato specificato la lingua non sia quella di default
					if args['lin'] ~= nil  or args['c'] ~= nil then 
						lingua = SwitchLang:gsub("^%l", string.upper)
					else
						lingua = 'Italiano'
					end
					
					link_coniugazione = 'Appendice:Coniugazioni/'..lingua..'/'.. titolo
					tCong = '&nbsp;([['..link_coniugazione..'|vai alla coniugazione]])'..categorizza(link_coniugazione,lingua)
				end
			end
	return tCong
end

local p = {}
--[[
Funzione per creare il testo; Funziona assemblando il titolo con le due funzioni locali:
1) LinkProgetto
2) LinkConiugazione
3) Errore
--]]

	function p.pn(frame)
		local args = getArgs(frame)
		lProg = LinkProgetto(frame)
		lCong = LinkConiugazione(frame)
		Err = Errore(frame)
		
		if lProg ~= nil then
			tProg = lProg
		end
		
		if Err ~= nil then
			tErr = Err
		end
		
		if lCong ~= nil then
			tCong = lCong
		end
		
		return "'''"..titolo.."'''<small>"	.. tProg .. "" .. tCong .. "</small>" .. tErr
	end

return p