Moduuli:Fr:Infobox/Fonctions/Bâtiment


local p = {}
local localdata = require( 'Module:Fr:Infobox/Localdata' )
local item = localdata.item
local wd = require( 'Module:Fr:Interface Wikidata' ).fromLua
local general = require 'Module:Fr:Infobox/Fonctions'
local linguistic = require "Module:Fr:Linguistique"
local address = require "Module:Fr:Adresse"

local function keydate(event)
	return wd.keyDate(event, item)
end

local function inclexcl(statement) -- formatte les qualificatifs "P518" / "P1011" (à mettre plutôt dans un sous module de Module:Fr:Wikidata, comme pour les dates ?
	local str = wd.formatSnak(statement.mainsnak)
	if not statement.qualifiers then
		return str
	end
	local incl = wd.getFormattedQualifiers(statement, "P518")
	local excl = wd.getFormattedQualifiers(statement, "P1011")

	if incl then
		str = str .. linguistic.inparentheses(incl .. " y compris") -- pas la formulation la plus élégante mais elle évite les problèmes d'accord grammaticaux
	end
	if excl then
		str = str .. linguistic.inparentheses("sans " .. excl) -- pas la formulation la plus élégante mais elle évite les problèmes d'accord grammaticaux
	end
	return str
end

function p.creatorQuery(prop) 
	return {
		property = prop,
		entity = localdata.item,
		showqualifiers = {'P518'},
		showdate = true,
		qualiflink = '-',
		statementformat = function(statement)
			
			local str
			-- On commence par les qualificatifs (attibué à, atelier etc.)
			local possiblequalifiers = {
				P1773 = "attribué $to $creator", 
				P1774 = "atelier $of $creator",
				P1775 = "suiveur $of $creator",
				P1776 = "cercle $of $creator",
				P1777 = "d'après $creator", -- TODO : d'après LE Maître X
				P1778 = "faux d'après $creator",
				P1779 = "$creator (?)",
				P1780 = "école $orégf",
				P1877 = "d'après un œuvre $of",
			}
	
			if statement.qualifiers then
				for qualif, text in pairs(possiblequalifiers) do
					local creator = wd.getFormattedQualifiers(statement, {qualif})
					if creator then
						str = text
						str = mw.ustring.gsub(str, '$to $creator', "à ".. creator)
						str = mw.ustring.gsub(str, '$of $creator', linguistic.of(creator))
						str = mw.ustring.gsub(str, '$creator', creator)
						break
					end
				end
			end
						
			-- Sinon, la voie normale
			if not str then
				str = wd.formatStatement(statement, {speciallabels = {Q4233718 = "anonyme"}}) -- speciallabels pour éviter le lien par défaut
			end
			return str
		end
	}
end

--Titrest
function p.title()
	--	local class = en-tête par défaut à définir ici ?
	return general.title()
end

--Image
function p.mainimage(cat, defaultimage)
	if not cat then 
		cat = 'Article à illustrer Bâtiment divers'
	end
	return general.mainimage(cat, defaultimage)
end

function p.country()
	return -- déprécié	
end


function p.historicalregion()
	return nil -- paramètre région mis dans adminlocation() : le gens l'utilisent pour la région administrative plutôt que pour la région historique
end

function p.adminlocation() -- Fonction assez compliquée du fait des différences entre infobox. Simlifiable si on harmonise les infobox
	-- infobox à prendre en compte : bâtiment, gratte-ciel, gare, château

	local streetstr = localdata['osoite']
	local area = localdata['sijainti']
	local city = localdata['kunta'] 

	local div1 = localdata['subdivision'] or localdata['subdivision1']  or localdata['subdivision 1']
	local div2 = localdata['subdivision2'] or localdata['subdivision 2']
	local div3 = localdata['subdivision3'] or localdata['subdivision 3']
	local div4 = localdata['région']
	local citystr = linguistic.conj({area, city}, "comma") 
	local divstr = linguistic.conj({div1, div2, div3}, "comma")
	divstr = linguistic.conj({citystr, divstr, div4}, "new line") -- on fait plusieusr lignes différentes pour éviter que ce soit trop moches avec des drapeaux
	local country = localdata['valtio']

	
	local val = linguistic.ucfirst(address.fullAddress(localdata['item'], country, nil, streetstr, divstr ))
	return 
	{
		type = "row",
		label = "Sijainti",
		value = function() return val end
	}
end

function p.onshoreof()
	return {
		type = 'row',
		label = 'Vesistö',
		value = {'vesistö', 'rannalla'},
		wikidata = {property = 'P206', defaultlinkquery = {property = 'P361'}},
	}
end

function p.protectedarea()
	return {
		type = 'row',
		label = 'Suojelualue',
		plurallabel = 'Suojelualueet',
		value = {'suojelualue'},
		property = 'P3018',
	}
end

function p.elevation()
	return {
		type = 'row',
		label = 'Korkeus merenpinnasta',
		value = 'korkeus',
		wikidata = {property = 'P2044', targetunit = 'm', conjtype = ' tai ', rounding = '0', numval = '2'},
	}
end

function p.coordinates(args)
	return general.coordinates(args)
end

function p.website() 
	return general.website()
end

function p.construction()
	return {
		type = 'multi', 
		rows = {

			-- début construction, fin construction (legacy infobox Stade, Infobox Château),
			{
				type = 'row',
				value = {'début construction', 'début'}, 
				label = 'Construction', 
			},
			{
				type = 'row',
				value = {'fin construction', 'fin'}, 
				label = 'Fin de construction', 
			},

			-- construction (nom de paramètre "date de construction" à déprécier)
			{
				type = 'row',
				value = {'valmistumisvuosi', 'rakennettu', 'date de construction'}, 
				label = 'Valmistuminen', 
				wikidata = keydate{'Q385378', 'P571'}
			},
		}
	}

end

function p.opening()  --ouverture / consécration / date de mise en service (!= date de construction)
	return {
		type = 'multi', 
		rows = {
			{
				type = 'row', 
				value =  {"date d'ouverture", "mise en service"}, 
				label = 'Otettu käyttöön', 
				wikidata = keydate{'P1619', 'Q15051339'} -- P1619 = ouverture officielle, pas ouverture de facto
			},
			{
				type = 'row', 
				value = 'inauguration', 
				label = 'Vihkimistilaisuus',
				blockers = 'Otettu käyttöön', 
				wikidata = keydate{'Q1417098'}
			},

			{
				type = 'row', 
				value = 'consécration', 
				label = 'Consécration',
				blockers = 'Vihkimistilaisuus',
				wikidata = keydate{ 'Q125375'}
			},
			{
				type = 'row', 
				value = {'loistoksi', 'ensivalo'}, 
				label = 'Ensivalo',
				blockers = 'Otettu käyttöön',
				wikidata = keydate{'Q1306940'} -- P1619 = ouverture officielle, pas ouverture de facto
			}
		}
	}
end


function p.renovation()
	return {
		type = 'multi', 
		rows = {
			{
				type = 'row',
				value = 'restauration',
				label = 'Restauration',			
				wikidata = keydate{'Q217102'},
				blockers = 'rénovation',
			},
			{
				type = 'row',
				value = 'rénovation',
				label = 'Rénovation',			
				wikidata = keydate{'Q2144402'},
				blockers = 'restauration',
			},
			{
				type = 'row',
				value = {'extension', 'agrandissement'},
				label = 'Extension',		
				wikidata = keydate{'Q18621193'},
				blockers = 'restauration',
			},
			{
				type = 'row',
				value = 'autres travaux',
				label = 'Autres campagnes de travaux',		
		},
	}
}
end

function p.demolition()
	return {
		type = 'multi', 
		rows = {
			{
				type = 'row',
				value = {'purettu','démolition', 'date de démolition'},
				label = 'Purettu',
				wikidata = keydate('Q331483')
				},
				{
				type = 'row',
				value = {'tuhoutui', 'destruction'},
				label = 'Tuhoutuminen',
				wikidata = keydate('Q17781833')
			}
		}
	}
end

function p.closure()
	return {
		type = 'row',
		value = {'fermeture', 'date de fermeture'},
		label = 'Fermeture',
		wikidata = keydate{'Q14954904', 'P3999', 'P576'} -- P576: date de dissolution, plutôt réservé aux organisations
	}
end

function p.usage()
	return {
		type = 'row',
		label = 'Käyttö',
		value = 'käyttö', 
		wikidata = {
			property = 'P366',
			link = '-',
			speciallabels = {Q182060 = 'bureaux'}, -- bureaux semble toujours pouvoir se mettre au pluriel quand c'est en P366 d'un bâtiment
		}	
	}
end

function p.operator()
	return {
		type = 'row',
		label = 'Käyttäjä',
		wikidata = {property = 'P466', showdate= true},
		value = {'administration', 'gestionnaire'}
	}
end

function p.transport()
	return {
		type = 'multi', 
		rows = {
			{type = 'row', label = 'Stationnement', value = 'stationnement'},
			{type = 'row', label = 'Gare', value = 'gare'},
			{type = 'row', label = 'Métro', value = 'métro'},
			{type = 'row', label = 'Tramway', value = {'tram', 'tramway'}},
			{type = 'row', label = 'Autobus', value = 'bus'},
		},
	}
end

function p.complex() -- le complexe immobilier auquel appartient un bâtiment
	return {
		type = 'row',
		label = 'Osa kohdetta',
		value = 'osa kohdetta',
		wikidata = {
			property = 'P361',
			condition = function(claim)
				local v = wd.getmainid(claim)
				return wd.isInstance("Q1497364", v, 1)
			end,
		}
	}
end

function p.archistyle()
	return {
		type = 'row',
		label = 'Tyylisuunta',
		value = {'tyylisuunta', 'style architectural', 'style'},
		wikidata = function ()
			local val = wd.formatAndCat{entity = localdata.item, property = 'P149'}
				or wd.formatAndCat{entity = localdata.item, property = 'P135'}
			if not val then
				return nil
			end
			val = mw.ustring.gsub(val, "\|style ", "\|")
			return val
		end
	}
end

function p.creator() -- toute sorte de créateurs, pourraient peut-être être partagé avec infobox oeuvre d'art
	local wdarchitect, wdengineer = p.creatorQuery("P84"), p.creatorQuery("P631")
	if wdarchitect and wdengineer then -- ne pas afficher les deux si c'est la même valeur
		if (wd.formatStatements{property = "P84", displayformat = "raw", entity= localdata.item} == wd.formatStatements{property = "P631", displayformat = "raw", entity = localdata.item}) then
			wdengineer = nil
		end
	end
	return {
		type = 'multi',
		rows = {
			-- architect
			{
				type = "row",
				label = localdata["titre architecte"] or "Arkkitehti",
				plurallabel = "Arkkitehdit",
				value = "arkkitehti",
				wikidata = wdarchitect,
			},
			-- ingénieur
			{
				type = "row",
				label = "Suunnittelija",
				plurallabel = "Suunnittelijat",
				value = "suunnittelija",
				wikidata =  wdengineer,
			},
			-- créateur (quand les autres noms ne conviennent pas)
			{	type = "row",
				label = "Luoja",
				plurallabel = "Luojat",
				value = "luoja",
				-- ne pas utiliser Wikidata si le paramètre "architecte" est renseigné (risques de doublon)
				wikidata =  p.creatorQuery("P170"),
				blockers = {'arkkitehti'},
			},
		}
	}
end


function p.owner()
	return {
		type = 'multi', 
		rows = {
			{
				type = 'row',
				label = 'Propriétaire initial',
				plurallabel = 'Propriétaires initiaux',
				value = 'propriétaire initial',
			},
			{
				type = 'row',
				label = 'Propriétaire actuel',
				plurallabel = 'Propriétaires actuels',
				value = 'propriétaire actuel',
			},
			{
				type = 'row',
				label = 'Omistaja',
				plurallabel = 'Omistajat',
				value = 'omistaja',
				wikidata = require('Module:Fr:Propriétaire').formatFromItem(localdata.item)
			}
		}
	}
end

function p.shape()
	return {
		type = 'row',
		label = 'Muoto',
		value = {'muoto', 'forme', 'aspect'},
		property = 'P1419',
	}
end

function p.dimensions()
	return {
	type = 'multi', 
		rows = {
	{
		type = 'row',
		label = 'Antennin huippu' ,
		value = 'antenni/huippu',
		wikidata = {property = 'P2048', targetunit = 'm', qualifier = 'P518', qualifiervalue = {'Q131214','Q852590'}}
	},
	{
		type = 'row',
		label = 'Kattokorkeus',
		value = 'katto_korkeus',
		wikidata = {property = 'P2048', targetunit = 'm', qualifier = 'P518', qualifiervalue = 'Q83180'}
	},
	{
		type = 'row',
		label = 'ylin_kerros',
		value = 'Ylin kerros' 
	},
--- Hauteur générique : exclut lesvaleurs Wikidata affichées dans une des lignes précedentes + affiche le qualificatif P518
	{
		type = 'row',
		label = 'Korkeus',
		value = 'korkeus',
		wikidata =  {property = 'P2048', targetunit = 'm', statementformat = function(statement) return inclexcl(statement) end, excludequalifier = {'P518', 'P794'}, excludequalifiervalue = {'Q24192182', 'Q131214','Q852590', 'Q83180'}}
	},
	{
		type = 'row',
		label = 'Paksuus',
		value = 'paksuus',
		wikidata = {property = 'P2610', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Pituus',
		value = 'pituus',
		wikidata = {property = 'P2043', targetunit = 'metre', statementformat = function(statement) return inclexcl(statement) end, conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Leveys',
		value = 'leveys',
		wikidata = {property = 'P2049', targetunit = 'metre',  statementformat = function(statement) return inclexcl(statement) end, conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Kärkiväli',
		value = 'kärkiväli',
		wikidata = {property = 'P2050', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Halkaisija',
		value = 'halkaisija',
		wikidata = {property = 'P2386', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Ympärysmitta',
		value = {'ympärysmitta', 'périmètre', 'contour', 'circonférence'},
		wikidata = {property = 'P2547', targetunit = 'metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	-- Hauteur (avec plusieurs différentes affichées pour les gratte-ciel, voir les bases Emporis ou skyscrapercenter
	{
		type = 'row',
		label = 'rakennelman Korkeus',
		value = 'rakennelman korkeus',
		wikidata =  {property = 'P2048', targetunit = 'm', qualifier = {'P794'}, {'P518', 'P794'}, qualifiervalue = {'Q24192182'}}
	},
	{
		type = 'row',
		label = 'Pinta-ala',
		value = {'pintaala', 'superficie'},
		wikidata = {property = 'P2046', targetunit = 'square meter', conjtype = ' ou ', rounding = '1', numval = '2'},
	},
	{
		type = 'row',
		label = 'Tilavuus',
		value = 'tilavuus',
		wikidata = {property = 'P2234', targetunit = 'cubic metre', conjtype = ' ou ', rounding = '1', numval = '2'},
	}
	}
}
end

function p.floors()
	return {
	type = 'multi', 
		rows = {
	{
		type = 'row',
		label = 'Maanpäällisiä kerroksia',
		value = {'maanpäällisiä kerroksia', 'kerroksia', 'niveaux au-dessus du sol', 'étages'},
		property = 'P1101',
	},
	{
		type = 'row',
		label = 'Maanalaisia kerroksia',
		value = 'maanalaisia kerroksia',
		property = 'P1139',
	}
	}
}
end

function p.destroyedby()
	return {
		type = 'row',
		label = 'Détruit par',
		value = {'détruit par', 'cause de la destruction'}, 
		property = 'P770',
	}
end

function p.material()
	return {
		type = 'row',
		label = 'Materiaali',
		plurallabel = 'Materiaalit',
		value = {'rakennusmateriaali', 'julkisivumateriaali'}, 
		wikidata = require('Module:Fr:Matériau').formatFromItem(localdata.item),
	}
end

function p.colour()
	return {
		type = 'row',
		label = 'Väri',
		plurallabel = 'Värit',
		value = {'väri', 'couleur', 'couleurs'},
		property = 'P462',
	}
end

function p.inscription()
	return {
		type = 'row',
		label = 'Merkinnät',
		value = {'merkinnät', 'inscription', 'enseigne'},
		wikidata = {property = 'P1684', numval = '1'},
	}
end

function p.equipment()
	return {
		type = 'row',
		label = 'Équipement',
		plurallabel = 'Équipements',
		value = {'équipement', 'équipements'},
		property = 'P912',
	}
end

function p.replaces()
	return {
		type = 'row',
		label = 'Edeltäjä',
		value = 'edeltäjä',
		property = 'P1398',
	}
end

function p.replacedby()
	return {
		type = 'row',
		label = 'Seuraaja',
		value = 'seuraaja',
		property = 'P167',
	}
end

function p.protection()
	return {
		type = 'row',
		label = 'Luokitus',
		value = {'kulttuuriperintökohteen luokitus', 'classement', 'protection'},
		wikidata = require('Module:Fr:Classement').formattedList(localdata.item)
	}
end

function p.geoloc(params)
	return general.geoloc(params)
end

return p