Modul:Popis stanovništva


local p = {}
	
godinePopisa = {2001, 2011, 2021}

local izvor = '[https://dzs.gov.hr Državni zavod za statistiku] RH'
local azurirano = '22. rujna 2022.'

local entityID = mw.wikibase.getEntityIdForCurrentPage()

function sorter(tablica)
	local kopija = {}
	for _, v in pairs(tablica) do
		kopija[#kopija+1] = v
	end
	
	table.sort(kopija, compare)
	return kopija
end

function compare(a,b)
--	mw.logObject(a.ime)
	return a.ime < b.ime
end

function calculate_logarithmic_percentage_change(current_population, previous_population)
    if current_population <= 10 or previous_population <= 10 then
        return nil  -- Handle cases where populations are non-positive
    end
    local log_percent_change = math.abs((math.log(current_population) - math.log(previous_population)) / math.log(previous_population)) * 100
    --mw.log(previous_population, " to ", current_population, " = ", log_percent_change)
    return log_percent_change
end



function printOpcinaBezNaselja(zupanija, kratica, opcina)
	ret = '|-\n| colspan="2"|\n'
		.. '{| style="width: 100%;"\n|-\n| colspan="4" | <hr>\n'
		.. '|-\n| colspan="4" style="text-align: center;" | <b>Broj stanovnika</b><br />'
		.. 'Općina ' .. opcina.ime .. ', ' .. zupanija .. '&lsqb;[[Modul:Popis stanovništva/'.. kratica .. '|uredi]]&rsqb;\n'
		.. '|-\n! ' .. godinePopisa[1] .. '. || ' .. godinePopisa .. '. || ' .. godinePopisa[3] .. '.\n'
		.. '|-\n| '.. opcina['popis' .. godinePopisa[1]] ..' ||| '.. opcina['popis' .. godinePopisa[2]] .. ' || '.. opcina['popis' .. godinePopisa[3]] .. '\n'
		.. '|-\n| colspan="4" | <hr>'
		.. '\n|}\n'
		
	return ret
end


function printOpcinaSaNaseljima(zupanija, kratica, opcina)
	local uvlaka = ''
	local kopija = sorter(opcina.naselja)
	
	ret = '{| class="wikitable sortable" style="text-align:center;" \n|-\n'
		.. '|+ colspan="4" style="text-align: center;" | <b>Broj stanovnika</b><br />'
		.. 'Općina ' .. opcina.ime .. ', ' .. zupanija .. ' &lsqb;[[Modul:Popis stanovništva/'.. kratica ..'/'.. opcina.ime .. '|uredi]]&rsqb;\n'
		.. '|-\n! style="width:20%;"| Naselje ||style="width:20%;"| ' .. godinePopisa[1] ..'. ||style="width:20%;"| ' .. godinePopisa[2] ..'. ||style="width:20%;"| ' .. godinePopisa[3] ..'.\n'
		
		
	for _, v in ipairs(kopija) do
		ret = ret .. '|-\n| style="width:20%;"|' .. uvlaka .. v.ime ..' ||style="width:20%;"| '.. v['popis' .. godinePopisa[1]] ..' ||style="width:20%;"| '.. v['popis' .. godinePopisa[2]] .. ' ||style="width:20%;"| '.. v['popis' .. godinePopisa[3]] .. '\n'
		end
	
	
	--ret=ret.. '|-\n|Ukupno||1||2||3\n|}\n'
	ret=ret .. '|-\n! scope="row" style="width:20%;"| Ukupno &lsqb;[[Modul:Popis stanovništva/'.. kratica .. '|uredi]]&rsqb; ||style="width:20%;"| '.. opcina['popis' .. godinePopisa[1]] ..' ||style="width:20%;"| '.. opcina['popis' .. godinePopisa[2]] .. ' ||style="width:20%;"| '.. opcina['popis' .. godinePopisa[3]] .. '\n'
	.. '\n|}\n'
--	.. '\n|}'
	
	return ret
end

function printOpcinaSaNaseljimaInfobox(zupanija, kratica, opcina)
	local uvlaka = ''
	local kopija = sorter(opcina.naselja)
	
	
	ret = '|-\n|colspan="2"|\n'
		.. '{| style="width: 100%;"\n|-\n'
		.. '| colspan="5" style="text-align: center;" | <b>Broj stanovnika</b><br />'
		.. opcina.ime .. ', ' .. zupanija .. ' &lsqb;[[Modul:Popis stanovništva/'.. kratica ..'/'.. opcina.ime .. '|uredi]]&rsqb;\n'
		.. '|-\n! colspan="2" | Naselje ||style="width:20%;"| ' .. godinePopisa[1] ..'. ||style="width:20%;"| ' .. godinePopisa[2] ..'. ||style="width:20%;"| ' .. godinePopisa[3] ..'.\n'
		.. '|-\n'
		.. '| colspan="5" | \n'
		.. '{| class="mw-collapsible mw-collapsed nomobile" style="width:100%"\n'
		.. '|+ class="nowrap" style="font-size: 80%; padding: 0;"| Popis naselja\n'
		
	local zbroj = {
    [1] = 0,
    [2] = 0,
    [3] = 0,
}

	local flag = {
    [1] = 0,
    [2] = 0,
    [3] = 0,
}

local provjeriti = false
		
		
	for _, v in ipairs(kopija) do
		ret = ret .. '|-\n |' .. uvlaka .. v.ime ..' ||style="width:20%;"| '.. (v['popis' .. godinePopisa[1]] or '?') ..' ||style="width:20%;"| '.. (v['popis' .. godinePopisa[2]] or '?') .. ' ||style="width:20%;"| '.. (v['popis' .. godinePopisa[3]] or '?').. '\n'

		zbroj[1] = zbroj[1] + (tonumber(v['popis' .. godinePopisa[1]]) or 0)
		zbroj[2] = zbroj[2] + (tonumber(v['popis' .. godinePopisa[2]]) or 0)
		zbroj[3] = zbroj[3] + (tonumber(v['popis' .. godinePopisa[3]]) or 0)
		


local test  = calculate_logarithmic_percentage_change((tonumber(v['popis' .. godinePopisa[2]]) or 0), (tonumber(v['popis' .. godinePopisa[1]]) or 0))
local testt = calculate_logarithmic_percentage_change((tonumber(v['popis' .. godinePopisa[3]]) or 0), (tonumber(v['popis' .. godinePopisa[2]]) or 0))
-- mw.log(test, testt)
	if (test ~= nil and test > 50) or (testt ~= nil and testt > 50) then
    provjeriti = true
end

end

	
	ret=ret.. '\n|-\n| colspan="4" | <hr>\n'
	..'|}\n|-\n'
	.. '| colspan="5"|\n{| style="width: 100%;"\n'
	.. '|-\n| Ukupno<br />&lsqb;[[Modul:Popis stanovništva/'.. kratica .. '|uredi]]&rsqb; ||style="width:20%;'
		
	if not (zbroj[1] == tonumber(opcina['popis' .. godinePopisa[1]])) and not (zbroj[1] == 0) then ret=ret .. 'color: red;' flag[1] = 1 end
	ret = ret .. '"| '.. (opcina['popis' .. godinePopisa[1]] or '?') ..' ||style="width:20%;'
		
	if not (zbroj[2] == tonumber(opcina['popis' .. godinePopisa[2]])) and not (zbroj[2] == 0) then ret=ret .. 'color: red;' flag[2] = 1 end
	ret = ret .. '"| '.. (opcina['popis' .. godinePopisa[2]] or '?') ..' ||style="width:20%;'
	
	if not (zbroj[3] == tonumber(opcina['popis' .. godinePopisa[3]])) and not (zbroj[3] == 0) then ret=ret .. 'color: red;' flag[3] = 1 end 
	ret = ret .. '"| '.. (opcina['popis' .. godinePopisa[3]] or '?') ..'\n'
	.. '|-\n| colspan="4" | <div style="text-align: center;">'
	.. '<b>Izvor</b>: ' .. izvor .. '<br>'
	.. 'Podatci sukladni popisu od <b>' .. azurirano ..'</b></div><hr>'
	.. '\n|}\n'
	.. '|}\n'
	
	for k, v in pairs(flag) do
		if v == 1 then
			ret = ret .. '[[Kategorija:Popis stanovništva: pogreška u zbroju za ' .. godinePopisa[k] .. '. godinu]]'
		end
	end

	for k, v in pairs(zbroj) do
		if v == 0 then
			ret = ret .. '[[Kategorija:Popis stanovništva: nepotpuni podaci za ' .. godinePopisa[k] .. '. godinu]]'
		end
	end
	
	if provjeriti == true then 
		ret = ret .. '[[Kategorija:Popis stanovništva: velike promjene]]' end
	
	
	return ret..'\n'
end

function printNaselje(zupanija, kratica, opcina, naselje)
	local uvlaka = 'style="padding-left: 20px;" | '
	
	ret = '|-\n| colspan="2" style="text-align: center;" | <b>Broj stanovnika</b><br />'
		.. naselje.ime .. ' (' .. opcina .. ', ' .. zupanija .. ')' 
		.. ' &lsqb;[[Modul:Popis stanovništva/'.. kratica ..'/'.. opcina .. '|uredi]]&rsqb;\n'
	.. '|-\n|'.. uvlaka .. '<b>' .. godinePopisa[1] ..'.</b> || ' .. naselje['popis' .. godinePopisa[1]] .. '\n'
	.. '|-\n|'.. uvlaka .. '<b>' .. godinePopisa[2] ..'.</b> || ' .. naselje['popis' .. godinePopisa[2]] .. '\n'
	.. '|-\n|'.. uvlaka .. '<b>' .. godinePopisa[3] ..'.</b> || ' .. naselje['popis' .. godinePopisa[3]] .. '\n'
	.. '|-\n| colspan="2" | <div style="text-align: center;">'
	.. '<b>Izvor</b>: ' .. izvor .. '<br>'
	.. 'Podatci sukladni popisu od <b>' .. azurirano ..'</b></div><hr>'
	.. '\n'
	
	return ret
end

function odrediZupaniju()
	local zupanijaValue = string.lower(mw.getCurrentFrame():getParent().args["županija"] or 'nema')
	local zupanijaKratica = "AAA";
	if zupanijaValue:match("bjelovarsko") then zupanijaKratica = "BBŽ"
		elseif zupanijaValue:match("brodsko") then zupanijaKratica = "BPŽ"
		elseif zupanijaValue:match("dubrovačko") then zupanijaKratica = "DNŽ"
		elseif zupanijaValue:match("grad zagreb") then zupanijaKratica = "GZG"
		elseif zupanijaValue:match("istarska") then zupanijaKratica = "ISŽ"
		elseif zupanijaValue:match("karlovačka") then zupanijaKratica = "KAŽ"
		elseif zupanijaValue:match("koprivničko") then zupanijaKratica = "KKŽ"
		elseif zupanijaValue:match("krapinsko") then zupanijaKratica = "KZŽ"
		elseif zupanijaValue:match("ličko") then zupanijaKratica = "LSŽ"
		elseif zupanijaValue:match("međimurska") then zupanijaKratica = "MEŽ"
		elseif zupanijaValue:match("osječko") then zupanijaKratica = "OBŽ"
		elseif zupanijaValue:match("primorsko") then zupanijaKratica = "PGŽ"
		elseif zupanijaValue:match("požeško") then zupanijaKratica = "PSŽ"
		elseif zupanijaValue:match("splitsko") then zupanijaKratica = "SDŽ"
		elseif zupanijaValue:match("sisačko") then zupanijaKratica = "SMŽ"
		elseif zupanijaValue:match("virovitičko") then zupanijaKratica = "VPŽ"
		elseif zupanijaValue:match("vukovarsko") then zupanijaKratica = "VSŽ"
		elseif zupanijaValue:match("varaždinska") then zupanijaKratica = "VŽŽ"
		elseif zupanijaValue:match("zadarska") then zupanijaKratica = "ZDŽ"
		elseif zupanijaValue:match("zagrebačka") then zupanijaKratica = "ZGŽ"
		elseif zupanijaValue:match("kninska") then zupanijaKratica = "ŠKŽ"		-- "šibensko" vraća grešku !?
	end
	mw.log(zupanijaValue, zupanijaKratica)
	return zupanijaKratica
end


local function has_value (tab, val)
    for index, value in ipairs(tab) do
        if value == val then
            return true
        end
    end
    return false
end

function p.main(frame)
	local ret = ''
	local brojac = 0
	
	local dovrseneZupanije = {"BBŽ", "BPŽ", "DNŽ", "ISŽ", "KAŽ", 
							"KKŽ", "KZŽ", "LSŽ", "MEŽ", "OBŽ", 
							"PGŽ", "PSŽ", "SDŽ", "SMŽ", "VPŽ",
							"VSŽ", "VŽŽ", "ZDŽ", "ZGŽ", "ŠKŽ"}
	
	
	local kratica = odrediZupaniju()
	
	if has_value(dovrseneZupanije, kratica) then 
	ulaz = require("Modul:Popis stanovništva/" .. kratica)
	else if kratica == "GZG" then 
			return ''
		else
			return '[[KT:Popis stanovništva - pogreška u imenu županije]]'			-- nisu još sve županije popunjene
		
		end
	end
	
	if kratica == "AAA" then
	ret = ret .. '\n[[KT:Popis stanovništva - pogreška u imenu županije]]'
	end
	
	local naslov = mw.title.getCurrentTitle().fullText:gsub(' %b()', '')			-- uklanja zagrade iz naslova)
	
		for mk, mv in pairs(ulaz) do -- opcina, grad, ime, kratica
			if type(mv) == 'table' then -- table opcina ili grad
				for k, v in pairs(mv) do -- qbroj, detalji
					if k == entityID or v.ime == naslov then -- opcina ili grad
						mw.log('opcina/grad found: '.. k..', ime ' ..v.ime )
							if frame.args[1]=='tablica' then
								ret = ret .. printOpcinaSaNaseljima(ulaz.ime, ulaz.kratica, v)
							else
								ret = ret .. printOpcinaSaNaseljimaInfobox(ulaz.ime, ulaz.kratica, v)
								brojac = brojac+1
							end
						
					else
						for tk, tv in pairs(v.naselja) do -- qbroj, detalji naselja
							if tk == entityID or tv.ime == naslov then
								mw.log ('naselje found: ' .. tv.ime..', opcina ' ..v.ime)
								ret = ret .. printNaselje(ulaz.ime, ulaz.kratica, v.ime, tv)
								brojac = brojac+1
							end
						end
					end	
				end
			end
		end
--	end

	if brojac > 1 then
		ret = ret .. '\n[[KT:Popis stanovništva s višestrukim unosima]]'
	end
	
	return ret
	
end

return p