Határos[mi ez?] • [dokumentáció: mutat, szerkeszt] • [tesztek: létrehozás]

local getArgs = require('Modul:Arguments').getArgs
local bordersProperty = 'P47'
local p = {}
local replace = {
	['községekkel'] = '^(.+) község$',
	['megyékkel'] = '^(.+) megye$',
	['járásokkal'] = '^(.+) járás$',
	['kistérségekkel'] = '^(.+) kistérség$'	
}
local singular = {
	['községekkel'] = 'községgel',
	['megyékkel'] = 'megyével',
	['járásokkal'] = 'járással',
	['kistérségekkel'] = 'kistérséggel'
}

local function getWdData(id)
	local function processStatement(statement)
		local snak = statement.mainsnak
		if not snak or snak.snaktype ~= 'value' then
			return nil
		end
		local value = snak.datavalue.value
		if value['entity-type'] == 'item' then
			return 'Q' .. value['numeric-id']
		else
			return nil
		end
	end
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		return nil
	end
	local statements = entity:getBestStatements(bordersProperty)
	local results = {}
	for _, statement in pairs(statements) do
		local result = processStatement(statement)
		if result then
			table.insert(results, result)
		end
	end
	return results
end

local function formatEntityId(entityId, unitType)
	local link  = mw.wikibase.sitelink(entityId)
	local label = mw.wikibase.label(entityId)
	if replace[unitType] and label then
		local label2 = string.match(label, replace[unitType])
		if label2 then
			label = label2
		end
	end
	if link then
		if label then
			if mw.ustring.sub(label, 2) == mw.ustring.sub(link, 2) and 
				mw.ustring.lower(mw.ustring.sub(label, 1, 1)) == mw.ustring.lower(mw.ustring.sub(link, 1, 1)) then
				return '[[' .. label .. ']]'
			else
				return '[[' .. link .. '|' .. label .. ']]'
			end
		else
			return '[[' .. link .. ']]'
		end
	else
		return label or link  --TODO what if no links and label + fallback language?
	end
end

function p.main(frame)
	local args = getArgs(frame)
	local unitType = args[1] or 'községekkel'
	local wdData = getWdData(args.id)
	if not wdData or #wdData == 0 then
		return nil
	end
	local result = {}
	for _, v in pairs(wdData) do
		local formattedStatement = formatEntityId(v, unitType)
		if formattedStatement then
			table.insert(result, formattedStatement)
		end
	end
	local list = mw.text.listToText(result)
	if list ~= '' then
		local formatString = require('Modul:String').simpletitle() .. ' %s %s határos.'
		if #result == 1 then
			unitType = singular[unitType] and singular[unitType] or unitType
			return formatString:format(list, unitType) .. '[[Kategória:Egyetlen határos egységgel rendelkező lapok]]'
		else
			return formatString:format(list, unitType)
		end
	else
		return nil
	end
end

return p