Afișează numele unei entități (cu link) având în stânga un simbol asociat acestuia. Numele este identificat prin ID-ul itemului de Wikidata, iar proprietatea prin codul de la Wikidata al proprietății. Procedând așa, se garantează că linkul va duce mereu către articolul corect, iar numele și imaginea vor fi unice și actuale, fără a mai face vreo modificare în urma redenumirii.


local getArgs = require('Modul:Arguments').getArgs
local wikidata = require('Modul:Wikidata')
local StringUtils = require('Modul:StringUtils')
local DateUtils = require('Modul:DateUtils')
local GregorianDate = require('Modul:GregorianDate')
local join = require('Modul:Separated entries')._main
local libUtils = require('libraryUtil')
local p = {}

local maxSize = { ['P94'] = '23x23', ['P41'] = '23x23'}

local function toWikidataTimestamp(timestamp)
	local ret = nil
	if timestamp then
		ret = timestamp
		if mw.ustring.gmatch(timestamp, '^%d+$') then
			return '+' .. timestamp .. '-00-00', 9
		end
		if mw.ustring.find(timestamp, '%d+') == 1 then
			ret = '+' .. timestamp
		end
	end
	return ret
end


p._imageFromOneOfProps = function(entityId, imagePropIds, timestamp)
	local imageName = nil
	local maxSizeOfImage = nil
	for _idx, eachPropId in pairs(imagePropIds) do
		local defaultImageName = wikidata.findOneValueNoRef(eachPropId, entityId)
		local specificImageName = nil
		local dataClaim = nil
		if timestamp then
			dataClaim = wikidata.findClaimForTimestamp(entityId, eachPropId, timestamp)
		else
			local bestDataClaims = wikidata.findBestClaimsForProperty(entityId, eachPropId)
			if bestDataClaims and 0 < #bestDataClaims then dataClaim = bestDataClaims[1] end
		end
		if dataClaim and 'statement' == dataClaim.type and 'value' == dataClaim.mainsnak.snaktype then specificImageName = dataClaim.mainsnak.datavalue.value end

		if imageName == nil and (defaultImageName and mw.text.trim(defaultImageName) ~= '' or specificImageName and mw.text.trim(specificImageName) ~= '') then
			imageName = mw.text.trim(specificImageName or defaultImageName)
			maxSizeOfImage = StringUtils.appendIfMissing({maxSize[imagePropId] or '23x23', 'px'})
		end
	end
	
	local imageLink = ''
	if imageName and mw.text.trim(imageName) ~= '' then
		imageLink = '[[Fișier:' .. imageName .. '|' .. maxSizeOfImage .. '|border]]'
	end
	return imageLink
end

p._nameAndImageFromOneOfProps = function(entityId, imagePropIds, timestamp)
	libUtils.checkTypeForNamedArg('_nameAndImageFromOneOfProps', 'entityId', entityId, 'string', true)
	libUtils.checkTypeForNamedArg('_nameAndImageFromOneOfProps', 'imagePropIds', imagePropIds, 'table', false)
	libUtils.checkTypeForNamedArg('_nameAndImageFromOneOfProps', 'timestamp', timestamp, 'table', true)

	local articleLink = wikidata.findLinkToItem(entityId, true, false, true)

	local imageLink = p._imageFromOneOfProps(entityId, imagePropIds, timestamp)
	
	return mw.text.trim(join({imageLink, articleLink, separator = ' '}))
end

p._nameAndImage = function(entityId, imagePropId, timestamp)
	if not entityId or entityId == '' then return '' end
	
	libUtils.checkTypeForNamedArg('_nameAndImage', 'imagePropId', imagePropId, 'string', false)
	libUtils.checkTypeForNamedArg('_nameAndImage', 'entityId', entityId, 'string', true)
	libUtils.checkTypeForNamedArg('_nameAndImage', 'timestamp', timestamp, 'table', true)

	return p._nameAndImageFromOneOfProps(entityId, {imagePropId}, timestamp)
end

p.nameAndImage = function(frame)
	local args = getArgs(frame)
	local entityId = args[1]
	local propId = args[2]
	local timestamp = args[3] or args['timestamp']
	local wdTimestamp, wdTimestampPrecision = toWikidataTimestamp(timestamp)
	if timestamp then timestamp = DateUtils.parseWikidataDate(wdTimestamp, wdTimestampPrecision) end
	return p._nameAndImage(entityId, propId, timestamp)
end

p.nameAndCoatOfArms = function(frame)
	local args = getArgs(frame)
	local entityId = args[1]
	local timestamp = args[2] or args['timestamp']
	local wdTimestamp, wdTimestampPrecision = toWikidataTimestamp(timestamp)
	if timestamp then timestamp = DateUtils.parseWikidataDate(wdTimestamp, wdTimestampPrecision) end
	return p._nameAndImage(entityId, 'P94', timestamp)
end

p.nameAndFlag = function(frame)
	local args = getArgs(frame)
	local entityId = args[1]
	local timestamp = args[2] or args['timestamp']
	local wdTimestamp, wdTimestampPrecision = toWikidataTimestamp(timestamp)
	if timestamp then timestamp = DateUtils.parseDate(wdTimestamp, wdTimestampPrecision) end
	return p._nameAndImage(entityId, 'P41', timestamp)
end

p._nameAndFlagFromPropOfEntity = function(propId, entityId, timestamp)
	if not propId then return '' end
	local entity = entityId
	local claims = nil
	if type(entity) == 'table' then
		claims = entity:getBestStatements(propId)
	else
		if not entity then entity = mw.wikibase.getEntityIdForCurrentPage() end
		if type(entity) == 'number' then entity = 'Q' .. tostring(entityId) end
		if not entity then return nil end
		claims = mw.wikibase.getBestStatements(entity, propId)
	end
	
	local countryIdsList = {}
	if claims and 0 < #claims then
		for _,eachClaim in ipairs(claims) do
			if eachClaim.mainsnak.snaktype == 'value' then
				table.insert(countryIdsList, eachClaim.mainsnak.datavalue.value.id)
			end
		end
	end

	local countriesWithFlags = {}
	for _,eachCountryId in ipairs(countryIdsList) do
		table.insert(countriesWithFlags, p._nameAndImage(eachCountryId, 'P41', timestamp))
	end
	return table.concat(countriesWithFlags, tostring(mw.html.create('br')))
end

p.nameAndFlagFromPropOfEntity = function(frame)
	local args = getArgs(frame)
	local propId = args['pid'] or args[1]
	local entityId = args['qid'] or args[2]
	local timpestamp = args['timestamp'] or args[3]

	return p._nameAndFlagFromPropOfEntity(propId, entityId, timestamp)
end

p.flag = function(frame)
	local args = getArgs(frame)
	local entityId = args[1]
	local timestamp = args[2] or args['timestamp']
	if timestamp then
		local wdTimestamp, wdTimestampPrecision = toWikidataTimestamp(timestamp)
		timestamp = DateUtils.parseWikidataDate(wdTimestamp, wdTimestampPrecision)
	end
	return p._imageFromOneOfProps(entityId, {'P41'}, timestamp)
end

return p