Belgekirina modulê[biafirîne]
--[[
  Sous-module de Module:Tableau population d'article de commune de France contenant
  les fonctions de génération des introductions associées au divisions
--]]

local p = {}

p.outils = require("Modul:Nifûsa Fransa/hacet")
p.donnees = require("Modul:Nifûsa Fransa/dane")

local frame = mw.getCurrentFrame()
local lang = mw.language.getContentLanguage()

local function ajoutref(text, args)
	return frame:extensionTag("ref", text, args)
end


-- textes, "constantes", mis en variables pouralléger le code
p.intro_debut = [=[
L'évolution du nombre d'habitants est connue à travers les [[Recensement de la population|recensements de la population]] effectués dans la commune depuis %d. À partir de 2006, les [[Histoire du recensement de la population en France#Le recensement rénové en France (depuis 2004)|populations légales]] des communes sont publiées annuellement par l'[[Institut national de la statistique et des études économiques|Insee]]. Le recensement repose désormais sur une collecte d'information annuelle, concernant successivement tous les territoires communaux au cours d'une période de cinq ans. ]=]

-- note : ci-dessous les nombres+unités sont codés « en dur » pour éviter d'avoir à appeler en plus ces modèles
-- deuxième partie, commune < 10000
p.intro_petite = [=[
Pour les communes de moins de 10&nbsp;000&nbsp;habitants, une enquête de recensement portant sur toute la population est réalisée tous les cinq&nbsp;ans, les populations légales des années intermédiaires étant quant à elles estimées par interpolation ou extrapolation]=]

p.intro_petite2 = [=[
Pour la commune, le premier recensement exhaustif entrant dans le cadre du nouveau dispositif a été réalisé en ]=]

-- idem, pour commune > 10000
p.intro_grande = [=[
Pour les communes de plus de 10&nbsp;000&nbsp;habitants les recensements ont lieu chaque année à la suite d'une enquête par sondage auprès d'un échantillon d'adresses représentant 8 % de leurs logements, contrairement aux autres communes qui ont un recensement réel tous les cinq ans]=]

p.intro_note = [=[
Par convention dans Wikipédia, le principe a été retenu de n’afficher dans le tableau des recensements et le graphique, pour les populations légales postérieures à 1999, que les populations correspondant à une enquête exhaustive de recensement pour les communes de moins de 10&nbsp;000&nbsp;habitants, et que les populations des années 2006, 2011, 2016, etc. pour les communes de plus de 10&nbsp;000&nbsp;habitants, ainsi que la dernière population légale publiée par l’Insee pour l'ensemble des communes. ]=]

p.intro_drom = [=[
L'évolution du nombre d'habitants est connue à travers les [[Recensement de la population|recensements de la population]] effectués dans la commune depuis %d, premier recensement postérieur à la départementalisation de 1946. À partir de 2006, les [[Histoire du recensement de la population en France#Le recensement rénové en France (depuis 2004)|populations légales]] des communes sont publiées annuellement par l'[[Institut national de la statistique et des études économiques|Insee]]. Le recensement repose désormais sur une collecte d'information annuelle, concernant successivement tous les territoires communaux au cours d'une période de cinq ans. ]=]

p.intro_poly = [=[
La loi relative à la démocratie de proximité du 27 février 2002 a, dans ses articles consacrés au recensement de la population, instauré des recensements de la population tous les cinq ans en [[Nouvelle-Calédonie]], en [[Polynésie française]], à [[Mayotte]] et dans les îles [[Wallis-et-Futuna]], ce qui n’était pas le cas auparavant]=]


---- ceux-ci sont en fait vide mais séparés pour permettre des évolutions futures
-- dédié introduction canton
function p.intro_canton(data)
	return ""
end
-- dédié introduction arrondissement
function p.intro_arrondissement(data)
	return ""
end
-- dédié introduction fractions
function p.intro_fraction(data)
	return ""
end
-- dédié introduction departement
function p.intro_departement(data)
	return ""
end
-- dédié introduction région
function p.intro_region(data)
	return ""
end
-- dédié introduction pays
function p.intro_pays(data)
	return ""
end


-- intro "commune" avec traitement données
function p.intro_ccc(data, debut)
	if (data["premier"] == nil) then
		return "" -- protection
	else
		return mw.ustring.format(debut, data["premier"])
	end
end

-- partie +10000
function p.intro_p1k(data)
	local resu = p.intro_grande
	local ref = "[https://www.insee.fr/fr/information/2383265 L'organisation du recensement], sur [[Institut national de la statistique et des études économiques|insee.fr]]."
	local note = p.intro_note


	-- la note
	return resu .. ajoutref(ref, { name = "insee_orga_rec" }) ..  "<sup class=\"reference cite_virgule\">,</sup>" .. ajoutref(note,  { group = 'Note' })


end

-- partie -10000
function p.intro_m1k(data)
	local resu = p.intro_petite
	-- partie de "petit" qui nécessite calcul et traitements
	local ref = "[https://www.insee.fr/fr/information/2383265 L'organisation du recensement], sur [[Institut national de la statistique et des études économiques|insee.fr]]."
	resu = resu  .. ajoutref(ref, { name = "insee_orga_rec" })  .. "."
	

		  
	if ((data["recens-prem"] ~= nil)) then
		resu = resu .. " " .. p.intro_petite2 .. data["recens-prem"]
		ref = "[https://www.insee.fr/fr/information/2383410 Calendrier départemental des recensements], sur [[Institut national de la statistique et des études économiques|insee.fr]]." 
		resu = resu .. ajoutref(ref) .. "."
 
	end
	return resu
end


-- par type de commune
function p.intro_c_base(data, sup1k)
	local resu = p.intro_ccc(data, p.intro_debut)
	if (not sup1k) then
		resu = resu .. p.intro_m1k(data)
	else
		resu = resu .. p.intro_p1k(data)
	end
	return resu
end
function p.intro_c_drom(data, sup1k)
	local resu = p.intro_ccc(data, p.intro_drom)
	if (not sup1k) then
		resu = resu .. p.intro_m1k(data)
	else
		resu = resu .. p.intro_p1k(data)
	end
	return resu
end
function p.intro_c_com1(data, sup1k)
	local resu = p.intro_poly
	local ref = "[https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000000593100&categorieLien=cid#LEGISCTA000006085425 Titre V de la loi n° 2002-276 du 27 février 2002 relative à la démocratie de proximité]"
	
	ref = resu .. ajoutref(ref, { name = "LF_2002-276_T-V" }) .. "."

	return resu
end
function p.intro_c_com2(data, sup1k)
	local resu = p.intro_poly
	local ref =  "[https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000000593100&categorieLien=cid#LEGISCTA000006085425 Titre V de la loi n° 2002-276 du 27 février 2002 relative à la démocratie de proximité]"
	resu = resu .. ajoutref(ref, { name = "LF_2002-276_T-V" }) .. "."
	
	if (data["recens-prem"] ~= nil) then
		local lst, nb = p.outils.liste_annees_pred(data, data["recens-prem"])  -- liste des recensements précédents
		resu = resu .. " Pour la commune, le premier recensement exhaustif entrant dans le cadre du nouveau dispositif a été réalisé en " ..
		        data["recens-prem"]
		if (nb == 0) then
			resu = resu .. "." -- pas d'années précédentes
		elseif (nb == 1) then
			resu = resu .. ", le précédent recensement a eu lieu en " .. lst[1] .. "." -- un seul
		else
			resu = resu .. ", les précédents recensements ont eu lieu en "
			for i = 1, nb do
				if (i == 1) then
					resu = resu .. lst[i]
				elseif (i == nb) then
					resu = resu .. " et " .. lst[i] .. "."
				else
					resu = resu .. ", " .. lst[i]
				end
			end
		end
	end
	return resu
end
function p.intro_c_nouv(data)
	local resu = "L'évolution du nombre d'habitants est connue à travers les recensements de la population effectués dans la commune depuis sa création."
	return resu
end


-- dédié introduction des différents types de communes
function p.intro_commune(data)
	local resu
	
	-- selon la population (< ou > 10000 habitants)
	local sup1k = false
	if (data["recens-prem"] == "annuel") then
		sup1k = true
	end
	
	local fonctions = { -- liste des fonctions d'affichage chaque type de commune
		["commune"] = p.intro_c_base,
		["commune en DROM"] = p.intro_c_drom,
		["commune en COM1"] = p.intro_c_com1,
		["commune en COM2"] = p.intro_c_com2,
		["commune nouvelle"] = p.intro_c_nouv
	}
	local fun = fonctions[data["division"]] --
	
	if (not fun) then
		return ""  -- c'est une erreur mais on ne devrait jamais être ici avec une division non gérée
	end

	resu =  fun(data, sup1k)

	return resu
end


-- partie évolution de population
function p.evolution(data)
	local resu = "En $annee, $div comptait $pop habitants$note"
	local divtext = {
		["canton"] = "kanton",
		["arrondissement"] = "navçe",
		["département"] = "departmen",
		["région"] = "herêm",
		["pays"] = "welat",
		["default"] = "komûne"
	}
		if (data["nom"] == "Metropola Lyon") then 
			divtext = {
				["département"] = "metropol",
			}
		end
		if (data["nom"] == "Paris") then 
			divtext = {
				["departmen"] = "Paris",
			}
		end
	local annee = data["dernier"]
	local div = data["division"]
	div = divtext[div] or divtext.default
	local pop = data[data["dernier"]]["pop"]
	pop =  lang:formatNum(data[data["dernier"]]["pop"])
	
	local note = "Population municipale légale en vigueur au 1<sup>er</sup>&nbsp;janvier&nbsp;" .. annee+3 ..
				", millésimée $annee, définie dans les limites territoriales en vigueur au 1<sup>er</sup>&nbsp;janvier&nbsp;" .. annee+2 ..
				", date de référence statistique : 1<sup>er</sup>&nbsp;janvier&nbsp;$annee."
	local note_name = "Pop_mun_" .. annee
	if (data["nom-dep"] == "Mayotte") then -- Mayotte a un système de recensement différent
		note = "Population municipale légale en vigueur au 1<sup>er</sup> janvier " .. annee+1 ..
				", millésimée $annee, définie dans les limites territoriales en vigueur au 1<sup>er</sup> janvier " .. annee ..
				", date de référence statistique : 1<sup>er</sup> janvier $annee."
	end
	note = mw.ustring.gsub(note, "$annee", annee)
	note = ajoutref(note, { group = "Note", name = note_name })
		
	resu = mw.ustring.gsub(resu, "$note", note)
	resu = mw.ustring.gsub(resu, "$div", div)	
	resu = mw.ustring.gsub(resu, "$pop", pop)
	resu = mw.ustring.gsub(resu, "$annee", annee)

	-- pas d'augmentation / diminution pour les arrondissements
	if (data["division"] == "arrondissement") then
		resu = resu .. "."
		return resu
	end
	-- calcul de l'augmentation / diminution
	local delta = p.donnees.variation_texte(data)
	if (delta ~= nil) then
		resu = resu .. ", " .. delta
		-- seulement si on a une variation
		-- département associé (sauf pour les départements)
		local loadedData, wlm = p.donnees.charge_donnees(data["nom-dep"])
		local deltad = nil
		local nomdwp = nil
		if ((loadedData ~= nil) and (wlm == true)) then
			nomdwp = loadedData["nom-wp"]
			deltad = p.donnees.variation(loadedData, false)
		end
		-- France
		loadedData, wlm = p.donnees.charge_donnees("France")
		local deltaf = nil
		if (loadedData ~= nil) then  -- pour la France on ne teste que la présence des données
			deltaf = p.donnees.variation(loadedData, false)
		end
		-- dernière partie
		if ((deltad == nil) and (deltaf == nil)) then
			resu = resu .. "."
		else
			resu = resu .. " ("
			if (deltad ~= nil) then
				if (deltad > 0) then
					resu = resu .. nomdwp .. " : +" .. lang:formatNum(deltad) .. " %"
				else
					resu = resu .. nomdwp .. " : " .. lang:formatNum(deltad) .. " %"
				end
			end
			if (deltaf ~= nil) then
				if (deltad ~= nil) then
					resu = resu .. ", "
				end
				if (deltaf > 0) then
					resu = resu .. "[[Démographie de la France|France]] hors [[Mayotte]] : +" .. lang:formatNum(deltaf) .. " %"
				else
					resu = resu .. "[[Démographie de la France|France]] hors [[Mayotte]] : " .. lang:formatNum(deltaf) .. " %"
				end
			end
			resu = resu .. ")."
		end
	else
		resu = resu .. "."
	end
	return resu
end



-- fonction aiguillage pour les introduction
function p.introduction(data)
	local resu

	local fonctions = { -- fonctions à utiliser pour chaque type de division
		["canton"] = p.intro_canton,
		["arrondissement"] = p.intro_arrondissement,
		["département"] = p.intro_departement,
		["fraction cantonale"] = p.intro_fraction,
		["région"] = intro_region,
		["pays"] = p.intro_pays,
		["commune"] = p.intro_commune -- toutes les communes traitées là, différenciation après
	}
	local divfun = fonctions[data["division"]]
	if (not divfun) and (data["type"] == "commune") then
		divfun = fonctions["commune"]
	end
	if not divfun then
		return "<err>"
	end
	local resu = divfun (data)

	-- on ajoute la partie évolution de la population
	local txt = p.evolution(data)
	if ((txt ~= nil) and (txt ~= "")) then
		resu = resu .. "\n\n" .. txt
	end
	return resu
end


return p