Módulo:Country alias

-- This module returns the country name or the flag name for a country,
-- based on the three-letter IOC/CGA/FINA alias.

--[[
O seguinte código de país é usado para vários países:
    ANG (solução alternativa: adicionado ANG_CGF para uso com Jogos da Commonwealth)

Os nomes a seguir têm nomes/bandeiras diferentes com base no esporte/ano
    Grã-Bretanha (e N.I.)            GBR, GBR_WCA (adicionado posteriormente para adicionar texto entre parênteses)
    Hong Kong                        HKG, HKG_CGF (adicionado posteriormente para manter a bandeira colonial)
    Atletas Olímpicos Individuais    IOA, IOA_2000 (IOA mudou para Atletas Olímpicos Independentes em 2012)
    Atletas Russos				     OAR (2018), ROC_2020 (Verão de 2020, Inverno de 2022)
    SWZ                              A Suazilândia se tornou Essuatíni após os Jogos da Commonwealth de 2018
    MKD								 A Macedônia se tornou Macedônia do Norte em 2019
    ART								 Nenhum "Atleta" antes da Equipe de Refugiados @ 2017 AIMAG
    R.D. do Congo				     Was Zaire (ZAI) e Congo-Kinshasa (COK_COD)

Os seguintes países têm vários aliases devido a diferenças de CGF/COI/FINA/IAAF/etc ou usos obsoletos
    Anguila                          AIA, ANG_CGF
    Antígua e Barbuda                ANT, ATG
    Bahrein                          BHN, BHR, BRN
    Curaçao                          CUR, CUW
    Timor-Leste						 TLS, TMP
    Ilhas Malvinas					 FAI, FLK
    Ilhas Faroé                      FAR, FRO
    Guernsey                         GGY, GUE
    Irã                              IRI, IRN
    Irlanda                          IRE, IRL - IRE is *only* for CGF apps
    Jersey                           JER, JEY
    Líbano                           LBN, LIB
    Montserrat                       MNT, MSR
    Nicarágua                        NCA, NIC
    Ilha Norfolk                     NFI, NFK
    Omã                              OMA, OMN
    Equipe Olímpica de Refugiados    ROA, ROT, EOR
    Romênia                          ROM, ROU
    Santa Helena                     SHE, SHN
    São Vicente e Granadinas         SVG, VIN
    Sarawak                          SAR, SWK
    Singapura                        SGP, SIN
    África do Sul                    RSA, SAF
    Tonga                            TGA, TON
    Trinidad e Tobago                TRI, TTO
    Ilhas Turcas e Caicos            TCA, TCI, TKS

Estranheza que precisa ser revisitada
    Polinésia Francesa               PYF, TAH - TAH foi convertido para Taiti por SILÊNCIO
]]

local function stripToNil(text)
	-- If text is a string, return its trimmed content, or nil if empty.
	-- Otherwise return text (which may, for example, be nil).
	if type(text) == 'string' then
		text = text:match('(%S.-)%s*$')
	end
	return text
end

local function yes(parameter)
	-- Return true if parameter should be interpreted as "yes".
	return ({ y = true, yes = true, on = true, [true] = true })[parameter]
end

local function getAlias(args)
	-- Return alias parameter, possibly modified for exceptional cases.
	local alias = stripToNil(args.alias)
	local jogos = stripToNil(args.jogos)
	local ano = tonumber(args.ano)
	local nomeCompleto = stripToNil(args.nomeCompleto)
	if nomeCompleto then
		ano = tonumber(nomeCompleto:match('^%d+'))  -- ignore args.ano
	end
	if alias == 'ANG' then
		if jogos == 'Jogos da Commonwealth' then
			alias = 'ANG_CGF'
		end
	elseif alias == 'ART' then
		if jogos == 'Jogos Asiáticos de Artes Marciais e Recinto Coberto' then
			alias = 'ART_AIMAG'
		end
	elseif alias == 'GBR' then
		if jogos == 'Campeonato Mundial de Atletismo' or jogos == 'Campeonatos da Europa de Atletismo' then
			alias = 'GBR_WCA'
		elseif jogos == 'Campeonatos Europeus' then
			if ano == 2018 then
				alias = 'GBR_WCA'
			end
		end
	elseif alias == 'HKG' then
		if jogos == 'Jogos da Commonwealth' then
			alias = 'HKG_CGF'
		end
	elseif alias == 'IOA' then
		if ano == 2000 then
			alias = 'IOA_2000'
		end
	elseif alias == 'MAL' or alias == 'MAS' then
		if ano and ano < 1963 then
			alias = 'MAL'
		else
			alias = 'MAS'
		end
	elseif alias == 'SWZ' then
		if nomeCompleto then
			if ano and ano >= 2018 and nomeCompleto ~= 'Jogos da Commonwealth de 2018' then
				alias = 'SWZ_YO2018'
			end
		elseif ano and ano >= 2018 and jogos ~= 'Jogos da Commonwealth' then
			alias = 'SWZ_YO2018'
		else
			alias = 'SWZ_YO2018'
		end
	elseif alias == 'MKD' then
		if ano and ano < 2019 then
			alias = 'MKD'
		else
			alias = 'MKD_2019'
		end
	elseif alias == 'VNM' then
		if ano and ano <= 1954 then
			alias = 'VIE'
		end
	elseif alias == 'RUS' then
		if ano and ano==2020 then
			if jogos=='Jogos Olímpicos de Verão' then
				alias = 'ROC_2020'
			elseif jogos=='Jogos Paralímpicos de Verão' then
				alias = 'RPC'
			end
		elseif ano and ano==2022 and jogos=='Jogos Olímpicos de Inverno' then
			alias = 'ROC_2020'
		end
	elseif alias == 'ROC' then
		if ano and ano==1960 and jogos=='Jogos Olímpicos de Verão' then
			alias = 'ROC_Formosa'
		elseif ano and ( ano==1964 or ano==1968 ) and jogos=='Jogos Olímpicos de Verão' then
			alias = 'ROC_Taiwan'
		elseif ano and ano==2020 and jogos=='Jogos Olímpicos de Verão' then
			alias = 'ROC_2020'
		elseif ano and ano==2022 and jogos=='Jogos Olímpicos de Inverno' then
			alias = 'ROC_2020'
		elseif ano and ano==2020 and jogos=='Jogos Paralímpicos de Verão' then
			alias = 'RPC'
		else
			local pageName = mw.title.getCurrentTitle().text
			if pageName == 'Atletas do Comitê Olímpico Russo nos Jogos Olímpicos' then
				alias = 'ROC_2020'
			end
		end
	elseif alias == 'YUG' or alias == 'SCG' then
		if ano and ano > 1992 and ano < 2004 and jogos ~= 'Jogos Paralímpicos de Verão' then
			alias = 'FR_YUG'
		end
	elseif alias == 'ZAI' or alias == 'COD' then
		if ano and ano < 1971 then
			alias = 'COK_COD'
		elseif ano and ano <= 1996 then
			alias = 'ZAI'
		else
			alias = 'COD'
		end
	elseif alias == 'COK' then
		if ano and ano == 1968 then
			alias = 'COK_COD'
		else
			alias = 'COK'
		end
	end
	return alias
end

local function getFlag(args, country)
	-- Return name of flag selected from country data (nil if none defined).
	local ano = tonumber(args.ano)
	local jogos = stripToNil(args.jogos)
	if jogos then
		local gdata = country[jogos]
		if gdata then
			if type(gdata) == 'string' then
				return gdata
			end
			if gdata[ano] then
				return gdata[ano]
			end
		end
	end
	for _, item in ipairs(country) do
		if type(item) == 'string' then
			return item
		end
		if ano and ano <= item[1] then
			return item[2]
		end
	end
end

local data = mw.loadData('Módulo:Country alias/dados')
local function countryAlias(args)
	local alias = getAlias(args)
	local country = data.countries[alias] or data.countries[data.countryAliases[alias]]
	local function quit(message)
		return args.erro or error(message)
	end
	if not country then
		return quit('Alias de país inválido: ' .. tostring(alias))
	end
	if yes(args.bandeira) then
		return getFlag(args, country) or quit('Nenhuma bandeira definida para ' .. alias)
	else
		return country.name or quit('Nenhum nome definido para ' .. alias)
	end
end

local function flagIOC(frame)
	-- Implement {{flagIOC}} which previously called this module three times.
	-- Returns <flag> <country link> <athletes>, with the third value optional
	local args = frame:getParent().args
	local code = stripToNil(args[1]) or error('flagIOC parameter 1 should be a country code')
	local jogos = stripToNil(args[2])
	local athletes = stripToNil(args[3])
	jogos = jogos and (jogos .. ' Olympics') or 'Olympics'
	local parms = {
		alias = code,
		nomeCompleto = jogos,
		ano = jogos:match('^%d+'),
		jogos = jogos:gsub('^%d+ ?', ''),
	}
	local nomeCompleto = countryAlias(parms)
	parms.flag = true
	local dispName = nomeCompleto
	if nomeCompleto == 'ROC' then
		nomeCompleto = 'Atletas do Comitê Olímpico Russo'
	end
	return (('[[Ficheiro:{flag}|22x20px|border|alt=|link=]]&nbsp;[[{name} nos {jogos}|{dispName}]]{athletes}')
		:gsub('{(%w+)}', {
			athletes = athletes and
				('&nbsp;<span style="font-size:90%;">(' .. athletes .. ')</span>') or
				'',
			flag = countryAlias(parms),
			jogos = jogos,
			name = nomeCompleto,
			dispName = dispName,
		}))
end

local function flagXYZ(frame)
	-- Implement {{flagIOC2}} and its variants which previously called this module three times.
	-- Returns one of four possible outputs:
	--	from flagIOC2:			<flag> <country link> <athletes>, with the third value optional
	--	from flagIOC2team:		<flag> <country link> <country alias>
	--	from flagIOC2athlete:	<flag> <athlete(s)> <country alias/link>
	--	from flagIOC2medalist:	<athlete(s)><br><flag> <country link>
	local args = frame:getParent().args
	local dispType = stripToNil(frame.args['type'])
	local code=''
	local jogos=''
	local athletes=''
	if dispType == 'athlete-O' then
		-- Implement [[Template:FlagIOCathlete]].
		dispType = 'athlete'
		args[3] = (args[3] or '') .. ' Olympics'
	end
	if dispType == 'name' or dispType == 'team' then
		code = stripToNil(args[1]) or error('Parameter 1 should be a country code')
		jogos = stripToNil(args[2]) or error('Parameter 2 should be a competition name')
		athletes = stripToNil(args[3])
	elseif dispType == 'athlete' or dispType == 'medalist' then
		athletes = stripToNil(args[1]) or error('Parameter 1 should be the name(s) of the athlete(s)')
		code = stripToNil(args[2]) or error('Parameter 2 should be a country code')
		jogos = stripToNil(args[3]) or error('Parameter 3 should be a competition name')
	end
	
	local parms = {
		alias = code,
		nomeCompleto = jogos,
		ano = jogos:match('^%d+'),
		jogos = jogos:gsub('^%d+ ?', ''),
	}
	local nomeCompleto = countryAlias(parms)
	parms.flag = true
	local dispName = stripToNil(args.name)
	if nomeCompleto == 'ROC' then
		nomeCompleto = 'Atletas do Comitê Olímpico Russo'
		dispName = 'ROC'
		if dispType == 'team' then dispType = 'name' end
	end
	
	if dispType == 'name' then
		return (('[[Ficheiro:{flag}|22x20px|border|alt=|link=]]&nbsp;[[{name} nos {jogos}|{dispName}]]{athletes}')
			:gsub('{(%w+)}', {
				athletes = athletes and
					('&nbsp;<span style="font-size:90%;">(' .. athletes .. ')</span>') or
					'',
				flag = countryAlias(parms),
				jogos = jogos,
				name = nomeCompleto,
				dispName = dispName or nomeCompleto,
			}))
	elseif dispType == 'team' then
		return (('[[Ficheiro:{bandeira}|22x20px|border|alt=|link=]]&nbsp;[[{name} nos {jogos}|{dispName}]]{alias}')
			:gsub('{(%w+)}', {
				alias = ('&nbsp;<span style="font-size:90%;">(' .. code .. ')</span>'),
				flag = countryAlias(parms),
				jogos = jogos,
				name = nomeCompleto,
				dispName = dispName or nomeCompleto,
			}))
	elseif dispType == 'athlete' then
		return (('[[Ficheiro:{bandeira}|22x20px|border|alt=|link=]]&nbsp;{athletes}&nbsp;<span style="font-size:90%;">([[{name} nos {jogos}|{dispName}]])</span>')
			:gsub('{(%w+)}', {
				athletes = athletes,
				flag = countryAlias(parms),
				jogos = jogos,
				name = nomeCompleto,
				dispName = code,
			}))
	elseif dispType == 'medalist' then
		return (('{athletes}<br>[[Ficheiro:{bandeira}|23x15px|border|alt=|link=]]&nbsp;[[{name} nos {jogos}|{dispName}]]')
			:gsub('{(%w+)}', {
				athletes = athletes,
				flag = countryAlias(parms),
				jogos = jogos,
				name = nomeCompleto,
				dispName = dispName or nomeCompleto,
			}))
	end
end
local function main(frame)
	return countryAlias(frame.args)
end

return {
	flagIOC = flagIOC,
	flagXYZ = flagXYZ,
	main = main,
}