local p = {}

p.referentFormat = 'brackets'

-- locations where any referent is redundant or innecessary
function p.namingExceptions(id)
	local exc_id = {
		['Q60'] = true, -- Nova York
		['Q61'] = true, -- Washington DC (EUA)
		['Q84'] = true, -- Londra (inghiltera)
		['Q90'] = true, -- Parize (Fransa)
		['Q220'] = true, -- Roma (Itàlia)
		['Q2807'] = true, -- Madrid (Spagna)
	}
	return exc_id[id]
end

---- Cases by state

-- Canada, Quebec
local function namingLocationCA(qid, label, c_date, main)
	local adm = main.fetchAdministrativeEntity(qid, 'vec')
	local adm_entity = main.getAdmByID(adm, 'Q11828004', label) -- província del Canada
	if adm_entity and adm_entity == 'Quebec' and not string.find(label, adm_entity, 1, true) then -- no Sita de Quebec (Quebec)
		return main.addReferent(label, adm_entity, p.referentFormat)
	end
	return main.addReferent(label, 'Canada', p.referentFormat)
end

-- Spagna, per comarca/izola/província/comunità
local function namingLocationES(qid, label, c_date, main)
	local adm = main.fetchAdministrativeEntity(qid, 'vec')
	local community = main.getAdmByID(adm, 'Q10742', '') -- comunità autònoma
	if community == nil then
		community = main.getAdmByID(adm, 'Q3297051', '') -- comunità foral
	end
	if community == 'Izole Bałeàree' then
		return main.addReferent(label, main.getAdmByID(adm, 'Q23442', label) or 'Bałeari', p.referentFormat) -- izola
	elseif community == 'Catełogna' then
		if c_date < 1700 then
			return label
		end
		local comarca = main.getAdmByID(adm, 'Q937876', label) -- comarca de Catelogna
		if not comarca then
			comarca = main.getAdmByID(adm, 'Q19920968', label) -- entità teritoriale singular
		end
		if comarca
			and (mw.ustring.find(comarca, mw.ustring.sub(label, 1, -2), 1, true) -- no Barcelona ...
			or mw.ustring.find(label, comarca, 1, true)) -- no Guardiola de Berguedà 
		then
				return label
		end
		return main.addReferent(label, comarca or community, p.referentFormat)
	elseif community == 'Paeze Valensian' then
		if c_date < 1900 then
			return label
		end
		local comarca = main.getAdmByID(adm, 'Q766277', label) -- comarca del paeze valensian
		if comarca
			and (mw.ustring.find(comarca, mw.ustring.sub(label, 1, -2), 1, true) -- no Alacantí, ...
			or mw.ustring.find(label, comarca, 1, true))
			then
				return label
		end
		return main.addReferent(label, comarca or community, p.referentFormat)
	elseif community == 'Aragona' then
		if c_date > 1900 then
			local comarca = main.getReferencedEntity(qid, {
				['Q1425491'] = 'Ribagorça',
				['Q1479641'] = 'Llitera',
				['Q804160'] = 'Baix Cinca',
				['Q804156'] = 'Baix Aragó',
				['Q804155'] = 'Baix Aragó - Casp',
				['Q804156'] = 'Baix Aragó',
				['Q1544003'] = 'Matarranya'
				})
			if comarca then
				return main.addReferent(label, comarca, p.referentFormat)
			end
		end
	elseif community == 'Ìzołe Canàrie' then
		local adm_entity = main.getAdmByID(adm, 'Q23442', label) -- izola
		if adm_entity == nil and _date < 1800 then
			return main.addReferent(label, 'Canàrie', p.referentFormat)
		end
		if adm_entity == nil or mw.ustring.find(label, adm_entity or '', 1, true) then -- no Santa Cruz de Tenerife (Tenerife)...
			adm_entity = main.getAdmByID(adm, 'Q162620', label) -- provinsa de Spagna
		end
		if adm_entity and mw.ustring.find(label, adm_entity, 1, true) then -- no Las Palmas de Gran Canaria (Las Palmas)
			adm_entity = nil
		end
		return main.addReferent(label, adm_entity or 'Canàrie', p.referentFormat)
	elseif c_date < 1800 then
		return label
	end
	local province = main.getAdmByID(adm, 'Q162620', label) or community
	if mw.ustring.find(province or '', label, 1, true) then -- no Madrid (Comunidad de Madrid)...
		province = nil
	end
	return main.addReferent(label, province or 'Spagna', p.referentFormat)
end

-- EUA, per estat/territori
local function namingLocationUSA(qid, label, c_date, main)
	local adm = main.fetchAdministrativeEntity(qid, 'vec')
	local adm_entity = main.getAdmByID(adm, 'Q35657', label) -- estat dels Estats Units
	if adm_entity == nil then
		adm_entity = main.getAdmByID(adm, 'Q783733', label) -- territori no incorporat dels Estats Units
	end
	return main.addReferent(label, adm_entity or 'EUA', p.referentFormat)
end

-- Fransa, per comarca/regió_històrica/ultramar
local function namingLocationFR(qid, label, c_date, main)
	local adm = main.fetchAdministrativeEntity(qid, 'vec')
	local comarca = main.getAdmByID(adm, 'Q3573632', label) -- comarca
	local adm_entity = main.getAdmByID(adm, 'Q6465', label) -- departament francès
	if not comarca and adm_entity == 'Pirinei Orientałi' and c_date > 1700 then
		comarca = main.getReferencedEntity(qid, {
			['Q15475'] = 'Vallespir',
			['Q15476'] = 'Rosejon',
			['Q15477'] = 'Conflent',
			['Q15478'] = 'Capcir',
			['Q15479'] = 'Alta Cerdagna',
			['Q15481'] = 'Fenoleda'
		})
		if not comarca then
			comarca = 'Catełogna del Nord'
		end
	end
	if comarca and mw.ustring.find(label, comarca, 1, true) then -- no Cornellà de Conflent (Conflent)
		return label
	elseif comarca then
		return main.addReferent(label, comarca, p.referentFormat)
	end
	adm_entity = main.getAdmByID(adm, 'Q36784', label) -- regió de Fransa
	if adm_entity == 'Guadalupe' or adm_entity == 'Martinica' or adm_entity == 'Guaiana Francesa'
		or adm_entity == 'Mayotte' or adm_entity == 'Illa de la Reunió' or adm_entity == 'Còrsega'
		or adm_entity == 'Bretagna' then
			return main.addReferent(label, adm_entity, p.referentFormat)
	end
	adm_entity = main.getAdmByID(adm, 'Q719487', label) -- col·lectivitat d'ultramar
	if not adm_entity then main.getAdmByID(adm, 'Q161243', label) end -- territori dependent
	if adm_entity then
		return main.addReferent(label, adm_entity, p.referentFormat)
	elseif c_date > 1700 then
		return main.addReferent(label, 'Fransa', p.referentFormat)
	end
	return label
end

-- Itàlia, per illa
local function namingLocationIT(qid, label, c_date, main)
	local adm = main.fetchAdministrativeEntity(qid, 'vec')
	local region = main.getAdmByID(adm, 'Q1710033', label) -- Regió amb Estatut Especial
	if region == 'Sardegna' or region == 'Sicìlia' then
		return main.addReferent(label, region, p.referentFormat)
	end
	return main.addReferent(label, 'Itàlia', p.referentFormat)
end

-- Portugal, per regió autònoma
local function namingLocationPT(qid, label, c_date, main)
	local adm = main.fetchAdministrativeEntity(qid, 'vec')
	local adm_entity = main.getAdmByID(adm, 'Q2914565', label) -- regió autònoma de Portugal
	return main.addReferent(label, adm_entity or 'Portogało', p.referentFormat)
end

-- Regne Unit, per país/territori
local function namingLocationUK(qid, label, c_date, main)
	if c_date < 1000 then
		return label
	end
	local adm = main.fetchAdministrativeEntity(qid, 'vec')
	local adm_entity = main.getAdmByID(adm, 'Q3336843', label) -- país del Regne Unit
	if adm_entity == nil then
		if c_date < 1700 then
			return label
		else
			adm_entity = main.getAdmByID(adm, 'Q46395', label) -- territori britànic d'ultramar
		end
	end
	return main.addReferent(label, adm_entity or 'Regno Unio', p.referentFormat)
end

-- Xina, Tibet
local function namingLocationCN(qid, label, c_date, main)
	local adm = main.fetchAdministrativeEntity(qid, 'vec')
	local region = main.getAdmByID(adm, 'Q57362', label) -- regió autònoma de la República Popular de la Xina
	if region == 'Tibet' then
		return main.addReferent(label, region, p.referentFormat)
	end
	return main.addReferent(label, 'RP Cina', p.referentFormat)
end

function p.namingLocation(state_id, loc_id, loc_label, context_date, main)
	-- debugging: =p.namingLocation('Q29','Q10282','label')
	--local main = require('Module:Location')
	--local context_date = os.date('*t').year
	if state_id == 'Q16' then -- Canada
		return namingLocationCA(loc_id, loc_label, context_date, main)
	elseif state_id == 'Q29' then -- Spagna
		return namingLocationES(loc_id, loc_label, context_date, main)
	elseif state_id == 'Q30' then -- EUA
		return namingLocationUSA(loc_id, loc_label, context_date, main)
	elseif state_id == 'Q38' then -- Itàlia
		return namingLocationIT(loc_id, loc_label, context_date, main)
	elseif state_id == 'Q45' then -- Portogało
		return namingLocationPT(loc_id, loc_label, context_date, main)
	elseif state_id == 'Q142' then -- Fransa
		return namingLocationFR(loc_id, loc_label, context_date, main)
	elseif state_id == 'Q145' then -- Regno Unio
		return namingLocationUK(loc_id, loc_label, context_date, main)
	elseif state_id == 'Q148' then -- Repùblega Popolare de Cina
		return namingLocationCN(loc_id, loc_label, context_date, main)
	end
	return
end

return p
Traesto fora da Wikipèdia - L'ençiclopedia łìbara e cołaboradiva in łéngua Vèneta "https://vec.wikipedia.org/w/index.php?title=Modulo:Location/vec&oldid=1090008"