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

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 AutoDescriptionGalaxy={}


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


local entitiesArray = {catalog={}, code={}, galType={E="", SO="", Sa="", SB="", Irr=""}, constellation="", InstanceOf={}, radV="", redShift="", UGC="", DDO="", apparentMagnitude="", distancesFromEarth={}}
local entitiesArrayP = {P31="", P59="", P61="", P223="", P528="", P575="", P1090="", P1215="", P2067="", P2216="", P2583="", P6257="", P6259="", P6258=""}
local priority = {}


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

-- Последовательно проходим свойства в карточке викиданных, для формирования массива сущностей entitiesArray
function AutoDescriptionGalaxy.parsing(entity)
	entitiesArrayP["P31"]=AutoDescriptionGalaxy.parseP31(entity)
	entitiesArrayP["P59"]=AutoDescriptionGalaxy.parseP59(entity)
	entitiesArrayP["P61"]=AutoDescriptionGalaxy.parseP61(entity)
	entitiesArrayP["P223"]= AutoDescriptionGalaxy.parseP223(entity)
	entitiesArrayP["P528"]=AutoDescriptionGalaxy.parseP528(entity)
	entitiesArrayP["P575"]=AutoDescriptionGalaxy.parseP575(entity)
	entitiesArrayP["P1090"]=AutoDescriptionGalaxy.parseP1090(entity)
	entitiesArrayP["P1215"]=AutoDescriptionGalaxy.parseP1215(entity)
	entitiesArrayP["P2067"]=AutoDescriptionGalaxy.parseP2067(entity)
	entitiesArrayP["P2216"]=AutoDescriptionGalaxy.parseP2216(entity)
	entitiesArrayP["P2583"]=AutoDescriptionGalaxy.parseP2583(entity)
	entitiesArrayP["P6257"]=AutoDescriptionGalaxy.parseP6257(entity)
	entitiesArrayP["P6258"]=AutoDescriptionGalaxy.parseP6258(entity)
	entitiesArrayP["P6259"]=AutoDescriptionGalaxy.parseP6259(entity)
end

function AutoDescriptionGalaxy.forming()
	
	if(entitiesArray["UGC"] ~= "") or (entitiesArray["DDO"] ~= "") then
		local det=""
		details = details .. "(также известен как"
		if(entitiesArray["UGC"] ~= "") then det = det .. " [[Общий каталог галактик Уппсала|" .. entitiesArray.UGC .. "]]," end
		if(entitiesArray["DDO"] ~= "") then det = det .. " [[Каталог обсерватории Дэвида Данлапа|" .. entitiesArray.DDO .. "]]," end
        det=det:sub(1, #det - 1)
		details = details .. det
		details = details .. ")"
	end	
	
	if(entitiesArrayP["P31"] == "галактика") then description = description .. "[[Галактики|галактика]]" 
	else 
		for ki, vi in pairs (entitiesArray["InstanceOf"]) do
			description = description .. "[[" .. vi .. "]]" 
		end	
	end
	if(entitiesArray["constellation"] ~= "") then 
		if (string.find(entitiesArray["constellation"], ",") ) then
		else description = description .. " [[" .. entitiesArray["constellation"] .. "  (созвездие)|созвездия " .. entitiesArray["constellation"] ..  "]]." end
	else description = description .. "." end
	
	if(entitiesArrayP["P223"] ~= "") then 
		if (entitiesArrayP["P223"] ~= "full") then description = description .. " [[Морфологическая классификация галактик|Морфологический тип галактики]]: " .. entitiesArrayP.P223 .. "."
		else  
			description = description .. " [[Морфологическая классификация галактик|Морфологический тип галактики]]: " 
			i=1
			for ki, vi in pairs (entitiesArray.galType) do
				if (vi ~= "") then
					if(i>1) then description = description .. ", " .. vi i=i+1
					else description = description  .. vi i=i+1 end
				end
				
			end	
			description = description .. "."
		end
	end
	
	if(entitiesArrayP["P1215"] ~= "") then 
		description = description .. " [[Видимая звёздная величина|Блеск]]: " .. entitiesArrayP.P1215 .. "." 
		if(entitiesArray.apparentMagnitude <= 6) then description = description .. " Видна невооружённым глазом."
		else description = description .. " Видна только в телескоп." end
	end
	if(entitiesArrayP["P2067"] ~= "") then description = description .. " Масса: " .. entitiesArray["mass"] .. "M☉ ([[Солнечная масса|M☉]] = (1,98847 ± 0,00007)⋅10<sup>30</sup> кг)." end
	
	if(entitiesArrayP["P575"] ~= "") then description = description .. " Открыта [[" .. entitiesArrayP.P575 .. " год]]у." end 
	if(entitiesArrayP["P61"] ~= "") then description = description .. " Первооткрыватель — [[" .. entitiesArrayP.P61 .. "]]." end 
	
	if(entitiesArrayP["P1090"] ~= "") then description = description .. " [[Красное смещение]]: " .. entitiesArrayP.P1090 .. '.' end
	if(entitiesArrayP["P2583"] == "full") then  description = description .. " Расстояние от [[Земля|Земли]]: " .. entitiesArray.distanceFromEarth .. " cветовых лет." end
	
	if(entitiesArrayP["P6257"] ~= "") then description = description .. " [[Прямое восхождение]]: " .. entitiesArrayP.P6257 .. '.' end
	if(entitiesArrayP["P6258"] ~= "") then description = description .. " [[Склонение]]: " .. entitiesArrayP.P6258 .. '.' end 
	if(entitiesArrayP["P2216"] ~= "") then 
		if(string.find(entitiesArrayP.P2216, "километр в секунду")) then description = description .. " Радиальная скорость: " .. entitiesArray["radV"] .. " км/c."
		else description = description .. " Радиальная скорость: " .. entitiesArrayP["P2216"] .. "." end	
	end
	
	if(entitiesArrayP["P6259"] ~= "") then description = description .. " [[Эпоха (астрономия)|Эпоха]]: " .. "[[" .. entitiesArrayP.P6259 .. "]]" .. '.' end 
	
	if(entitiesArrayP["P528"] == "full") then
		description = description .. " <br><br>Код в каталоге: "
     	for k, v in pairs (entitiesArray.code) do
     		if(v ~= " ") then 
     			if (entitiesArray["catalog"][k] ~= " ") then description = description ..  v .. ' ([[' .. entitiesArray['catalog'][k] .. ']])' .. ", "
     			else description = description ..  v .. ", " end
     		end	
     	end	
        description=description:sub(1, #description - 2)
        description=description..". " 
	end	
	
	
	if(entitiesArray["constellation"] ~= "") then  
		if (string.find(entitiesArray["constellation"], ",") ) then 
		else categories = categories .. "[[Категория:Галактики созвездия " .. entitiesArray["constellation"] .. "]]" end
	end
	
	if(entitiesArrayP["P528"] == "full") then
     	for k, v in pairs (entitiesArray.code) do
     		if(v ~= " ") then 
     			if (entitiesArray["catalog"][k] ~= " ") then categories = categories .. "[[Категория:" .. entitiesArray["catalog"][k] .. "]]" end	
     		end	
     	end	
	end	
	
	if(entitiesArrayP["P223"] ~= "") then 
		--categories = categories .. "[[Категория:" .. entitiesArrayP.P223 .. " (Морфологический тип галактики)]]" 
	end
end	

function AutoDescriptionGalaxy.parseP31(entity)
 local p31Statements=mw.wikibase.getAllStatements(entity:getId(), 'P31' )
 local ignores={"галактика", "звезда"}
 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 for kj, vj in pairs (ignores) do if(vj == state) then state="" end end end
 			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 AutoDescriptionGalaxy.parseP59(entity)
 local value = entity:formatPropertyValues("P59",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then 
 	entitiesArray["constellation"]=value
 	return value
 else return "" end
end	

function AutoDescriptionGalaxy.parseP61(entity)
 local value = entity:formatPropertyValues("P61",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value
 else return "" end
end	

function AutoDescriptionGalaxy.parseP223(entity)
 local valueP=entity:formatPropertyValues("P223", { mw.wikibase.entity.claimRanks.RANK_PREFERRED }).value
 local value = entity:formatPropertyValues("P223",mw.wikibase.entity.claimRanks).value
 if(valueP ~= "") then return value
 elseif(value ~= "") then 
 	p223Statements=mw.wikibase.getBestStatements(entity:getId(), 'P223' )
 	for ki, vi in pairs (p223Statements) do
 	    local typeG=""
 		if((vi['mainsnak'] ~= nil)) then typeG=vi['mainsnak']['datavalue']['value'] end
 		if(typeG ~= "") then 
 			if(string.find(typeG, "E") and entitiesArray.galType.E == "") then entitiesArray.galType.E=typeG 
 			elseif(string.find(typeG, "S0") and entitiesArray.galType.SO == "") then entitiesArray.galType.SO=typeG 
 			elseif(string.find(typeG, "SB") and entitiesArray.galType.SB == "") then entitiesArray.galType.SB=typeG 
 			elseif(string.find(typeG, "S") and entitiesArray.galType.Sa == "" and entitiesArray.galType.SB == "" and entitiesArray.galType.SO == "") then entitiesArray.galType.Sa=typeG 
 			elseif(string.find(typeG, "Irr") and entitiesArray.galType.Irr == "") then entitiesArray.galType.Irr=typeG end
 		end	
 	end	
 	return "full"
 else return "" end
end	

function AutoDescriptionGalaxy.parseP528(entity)
  local p528Statements=mw.wikibase.getBestStatements(entity:getId(), 'P528' )
  i=1
  for ki, vi in pairs (p528Statements) do
  	local catalog=""
  	local code=""
  	if(vi['qualifiers'] ~= nil) then
  		if((vi['qualifiers']['P972'] ~= nil)) then catalog=vi['qualifiers']['P972'][1]['datavalue']['value']['id'] end	
  		if((vi['mainsnak'] ~= nil)) then code=vi['mainsnak']['datavalue']['value'] end
     	if (catalog ~= "") then entitiesArray["catalog"][i] = mw.wikibase.getLabel(catalog) 
     	else entitiesArray["catalog"][i] = " " end
     	if (code ~= "") then entitiesArray["code"][i] = code 
     	else entitiesArray["code"][i] = " "	end
  		i=i+1
  	end	
  	if (catalog ~= "") then
  		if (catalog == "Q2074058") then entitiesArray["DDO"] = code 
		elseif (catalog == "Q615925") then entitiesArray["UGC"] = code 
		else end	
  	end
  end	
  if (i>1) then return "full" 
  else return "" end 
end	

function AutoDescriptionGalaxy.parseP575(entity)
 local value = entity:formatPropertyValues("P575",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value
 else return "" end
end	

function AutoDescriptionGalaxy.parseP1090(entity)
 local value = entity:formatPropertyValues("P1090",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value
 else return "" end
end	

function AutoDescriptionGalaxy.parseP1215(entity)
 local valueP=entity:formatPropertyValues("P1215", { mw.wikibase.entity.claimRanks.RANK_PREFERRED }).value
 local valueN=entity:formatPropertyValues("P1215", { mw.wikibase.entity.claimRanks.RANK_NORMAL }).value	
 --local value = entity:formatPropertyValues("P1215",mw.wikibase.entity.claimRanks).value
 if(valueP ~= "") then 
 	entitiesArray["apparentMagnitude"]=MathTonumber.integerModule(valueP)
 	return valueP
 elseif(valueN ~= "") then 
 	entitiesArray["apparentMagnitude"]=MathTonumber.integerModule(valueN)
 	return valueN	
 else return "" end
end	

function AutoDescriptionGalaxy.parseP2067(entity)
 local value = entity:formatPropertyValues("P2067",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then 
 	entitiesArray["mass"]=MathTonumber.integerModule(value)
 	return value
 else return "" end
end	

function AutoDescriptionGalaxy.parseP2216(entity)
 local value = entity:formatPropertyValues("P2216",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then 
 	entitiesArray["radV"] = MathTonumber.integerModule(value)
 	return value
 else return "" end
end	

function AutoDescriptionGalaxy.parseP2583(entity)
  local p2583Statements=entity:getAllStatements("P2583")
  local i=1
  for ki, vi in pairs (p2583Statements) do
  	local amount=""
  	local upperBound=""
  	local erroR=""
  	if(vi['mainsnak'] ~= nil) then
  		if(vi['mainsnak']['datavalue']['value']['amount'] ~= nil) then amount=vi['mainsnak']['datavalue']['value']['amount'] end
  		if(vi['mainsnak']['datavalue']['value']['upperBound'] ~= nil) then 
  			upperBound=vi['mainsnak']['datavalue']['value']['upperBound'] 
  			erroR=MathTonumber.integerModule(upperBound)-MathTonumber.integerModule(amount)
  		end
  		if (erroR ~= "") then entitiesArray["distanceFromEarth"] = MathTonumber.integerModule(amount).."±"..erroR
  		else entitiesArray["distanceFromEarth"] = MathTonumber.integerModule(amount) end	
  		i=i+1
  	end	
  end	
  if(i>1) then return "full" end
end	

function AutoDescriptionGalaxy.parseP6257(entity)
 local value = entity:formatPropertyValues("P6257",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value
 else return "" end
end	

function AutoDescriptionGalaxy.parseP6258(entity)
 local value = entity:formatPropertyValues("P6258",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then 
 	value = string.gsub(value, "градус", '')
 	value = value .. '°' 
 	return value
 else return "" end
end	

function AutoDescriptionGalaxy.parseP6259(entity)
 local value = entity:formatPropertyValues("P6259",mw.wikibase.entity.claimRanks).value
 if(value ~= "") then return value
 else return "" end
end	

return AutoDescriptionGalaxy