Документация
--[[
------------------------------------------
--             AutoDescriptionStreet 
-- Модуль для заполнения улиц. 
------------------------------------------
--]]

local Dates = require("Module:Dates")
local Declension = require("Module:Declension")
local Langs = require("Module:Langs")
local MathTonumber = require("Module:Math/tonumber")
local ReturnGendered = require("Module:ReturnGendered")
local SerializeTable = require("Module:SerializeTable")
local Math = require("Module:Math")
local Country2Adj = require("Module:Country2Adj")

local AutoDescriptionStreet={}

-- Формируем и возвращаем три переменных
local description = "" -- строка описания
local details = "" -- уточнение
local categories = "[[Категория:Улицы по алфавиту]]" -- категории-- Промежуточный масив сущностей, в который помещаются результаты парсинга перед формированием описания

local entitiesArray = {administrativeT={}, instanceOf={}}
local entitiesArrayP = {P17="", P31="", P131="", P281="", P2043=""}
--P17:country
--P31:instance of
--P131:located in the administrative territorial entity
--P281:postal code
local propertyFull = {P131=""}

-- Точка входа
function AutoDescriptionStreet.launch(entity)
 AutoDescriptionStreet.parsing(entity) -- парсим карточку викиданных
 AutoDescriptionStreet.forming() -- формируем переменные
 return details, description, categories
end	

-- Последовательно проходим свойства в карточке викиданных, для формирования массива сущностей entitiesArray
function AutoDescriptionStreet.parsing(entity)
	entitiesArrayP["P17"] = AutoDescriptionStreet.parseP17(entity)
	entitiesArrayP["P31"] = AutoDescriptionStreet.parseP31(entity)
	entitiesArrayP["P131"] = AutoDescriptionStreet.parseP131(entity)
	entitiesArrayP["P281"] = AutoDescriptionStreet.parseP281(entity)
	entitiesArrayP["P2043"] = AutoDescriptionStreet.parseP2043(entity)
end

function AutoDescriptionStreet.forming()
	
	--Это улица
	if(entitiesArrayP["P31"] == "улица") then description = description .. "[[Улицы|улица]]." 
	else 
		description = description .. "улица." 
	end	 
	
	--В каком районе
	if(entitiesArrayP["P131"] ~= "") then 
		description = description:sub(1, -2) --удалил точку 
		if(entitiesArrayP["P131"] == "full") then
     		for k, v in pairs (entitiesArray.administrativeT) do
     			if(v ~= " ") then 
					local dec2 = Declension.declineWord(v, 2)
					local dec6 = Declension.declineWord(v, 6)
					if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
     					if(propertyFull["P131"] ~= "YES") then description = description .. " в " end
						description = description .. "[[" .. v .. "|" .. dec6 .. "]], "
						categories = categories .. "[[Категория:Улицы " .. dec2  .."]]"
					else
     					if(propertyFull["P131"] ~= "YES") then description = description .. " в " end
						description = description .. "([[" .. v .. "]]), " 
					end
					propertyFull["P131"] = "YES" --P131 для категории заполнена
     			end	
     		end
        	description = description:sub(1, #description - 2)
		else
			local dec2 = Declension.declineWord(entitiesArrayP.P131, 2)
			local dec6 = Declension.declineWord(entitiesArrayP.P131, 6)
			if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
				description = description .. " в [[" .. entitiesArrayP.P131 .. "|" .. dec6 .. "]]"
				categories = categories .. "[[Категория:Улицы " .. dec2  .."]]"
				propertyFull["P131"] = "YES" --P131 для категории заполнена
			end
		end
		description = description .. "." 
	end
	
	--В какой стране
	if(entitiesArrayP["P17"] ~= "") then 
		description = description:sub(1, -2) --удалил точку
		local dec2 = Declension.declineWord(entitiesArrayP.P17, 2)
		local dec6 = Declension.declineWord(entitiesArrayP.P17, 6)
		if(dec2 ~= "Logical error Declension.declineWord(arg): word not found") then 
			if(propertyFull["P131"] == "YES") then description = description .. " " --Если уже известен район, то 'в' не пишется
			else description = description .. " в " end
			description = description .. "[[" .. entitiesArrayP.P17 .. "|" .. dec6 .. "]]"
			categories = categories .. "[[Категория:Улицы " .. dec2  .."]]"
		end
		description = description .. "." 
	end
	
	--Почтовый индекс
	if(entitiesArrayP["P281"] ~= "") then
		description = description .. " Почтовый индекс: " .. entitiesArrayP.P281 .. "."
	end
	
	--Длина
	if(entitiesArrayP["P2043"] ~= "") then
		description = description .. " Протяжённость: " .. entitiesArrayP.P2043 .. "."
	end
	
end


function AutoDescriptionStreet.parseP17(entity)
 local value = entity:formatPropertyValues("P17", mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value 
 else return ""	end
end	  

function AutoDescriptionStreet.parseP31(entity)
 local p31Statements=mw.wikibase.getAllStatements(entity:getId(), 'P31' ) 
 local i=0
 if(p31Statements ~= "") then
 	for ki, vi in pairs (p31Statements) do
 		if((vi['mainsnak'] ~= nil)) then 
 			local state=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id'])
 			if (state ~= "") then
 				i=i+1
 				entitiesArray.instanceOf[i]=state
 			end	
 		end
 	end	
 	if(i>0) then return "full"
 	else return "улица" end	
 end
end	  

function AutoDescriptionStreet.parseP131(entity)
 local p131Statements=mw.wikibase.getAllStatements(entity:getId(), 'P131' ) 
 local i=0
 if(p131Statements ~= "") then
 	for ki, vi in pairs (p131Statements) do
 		if((vi['mainsnak'] ~= nil)) then 
 			local state=mw.wikibase.getLabel(vi['mainsnak']['datavalue']['value']['id'])
 			if (state ~= "") then
 				i=i+1
 				entitiesArray.administrativeT[i]=state
 			end	
 		end
 	end	
 	if(i>0) then return "full"
 	else 
 		value = entity:formatPropertyValues("P131", mw.wikibase.entity.claimRanks).value
 		if(value ~= "") then return value
 		else return value end
 	end	
 else return "" end
end	  

function AutoDescriptionStreet.parseP281(entity)
 local value = entity:formatPropertyValues("P281", mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value 
 else return ""	end
end	  

function AutoDescriptionStreet.parseP2043(entity)
 local value = entity:formatPropertyValues("P2043", mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value 
 else return ""	end
end	  

return AutoDescriptionStreet