local export = {}

local data = require("Module:place/data")
local m_shared = require("Module:place/shared-data")

function export.placetype_table()
	-- We combine all placetype data into objects of the following form:
	-- {aliases={ALIASES}, categorizes=true, equiv=PLACETYPE_EQUIVALENT,
	--  display=DISPLAY_FORM, article=ARTICLE, preposition=FOLLOWING_PREPOSITION}
	local alldata = {}

	local function ensure_key(key)
		if not alldata[key] then
			alldata[key] = {}
		end
	end

	-- Does it categorize? Yes if there is a key other than "article", "preposition", "synergy"
	-- or "default", or if there is a non-empty "default" key.
	for key, value in pairs(data.cat_data) do
		ensure_key(key)
		for k, v in pairs(value) do
			if k ~= "article" and k ~= "preposition" and k ~= "synergy" and k ~= "default" or
				k == "default" and next(v) then
				alldata[key].categorizes = true
				break
			end
		end
		alldata[key].article = value.article
		alldata[key].preposition = value.preposition
	end

	-- Handle equivalents
	for key, value in pairs(data.placetype_equivs) do
		ensure_key(key)
		alldata[key].equiv = value
		if alldata[value] and alldata[value].categorizes then
			alldata[key].categorizes = true
		end
		if alldata[value] and alldata[value].article then
			alldata[key].article = alldata[value].article
		end
		if alldata[value] and alldata[value].preposition then
			alldata[key].preposition = alldata[value].preposition
		end
	end

	-- Handle aliases
	for key, value in pairs(data.placetype_aliases) do
		ensure_key(value)
		if not alldata[value].aliases then
			alldata[value].aliases = {key}
		else
			table.insert(alldata[value].aliases, key)
		end
	end

	-- Handle display forms
	for key, value in pairs(data.placetype_links) do
		ensure_key(key)
		if value == true then
			alldata[key].display = "[[" .. key .. "]]"
		elseif value == "w" then
			alldata[key].display = "[[w:" .. key .. "|" .. key .. "]]"
		else
			alldata[key].display = value
		end
	end

	-- Convert to list and sort
	local alldata_list = {}
	for key, value in pairs(alldata) do
		table.insert(alldata_list, {key, value})
		if value.aliases then
			table.sort(value.aliases)
		end
	end
	table.sort(alldata_list, function(fs1, fs2) return fs1[1] < fs2[1] end)

	-- Convert to wikitable
	local parts = {}
	table.insert(parts, '{|class="wikitable"')
	table.insert(parts, "! Placetype !! Article !! Display form !! Following preposition !! Aliases !! Equivalent for categorization !! Categorizes?")
	for _, placetype_data in ipairs(alldata_list) do
		local placetype = placetype_data[1]
		local data = placetype_data[2]
		table.insert(parts, "|-")
		local sparts = {}
		table.insert(sparts, placetype)
		table.insert(sparts, data.article or placetype:find("^[aeiou]") and "an" or "a")
		table.insert(sparts, data.display or placetype)
		table.insert(sparts, data.preposition or "in")
		table.insert(sparts, data.aliases and table.concat(data.aliases, ", ") or "")
		table.insert(sparts, data.equiv or "")
		table.insert(sparts, data.categorizes and "yes" or "no")
		table.insert(parts, "| " .. table.concat(sparts, " || "))
	end
	table.insert(parts, "|}")
	return table.concat(parts, "\n")
end


function export.placename_table()
	-- We combine all placetype data into objects of the following form:
	-- {display=DISPLAY_AS, cat=CATEGORIZE_AS, article=ARTICLE}
	local alldata = {}

	local function ensure_key(key)
		if not alldata[key] then
			alldata[key] = {}
		end
	end

	-- Handle display aliases
	for placetype, names in pairs(data.placename_display_aliases) do
		for name, alias in pairs(names) do
			local place = placetype .. "/" .. name
			ensure_key(place)
			alldata[place].display = placetype .. "/" .. alias
		end
	end

	-- Handle category aliases
	for placetype, names in pairs(data.placename_cat_aliases) do
		for name, alias in pairs(names) do
			local place = placetype .. "/" .. name
			ensure_key(place)
			alldata[place].cat = placetype .. "/" .. alias
		end
	end

	-- Handle places with article
	for placetype, names in pairs(data.placename_article) do
		for name, alias in pairs(names) do
			local place = placetype .. "/" .. name
			ensure_key(place)
			alldata[place].article = alias
		end
	end

	-- Handle categorization for cities/etc.
	for _, group in ipairs(m_shared.polities) do
		for key, value in pairs(group.data) do
			-- Use the group's value_transformer to ensure that 'nocities' and 'containing_polity'
			-- keys are present if they should be.
			value = group.value_transformer(group, key, value)
			local placename = key:gsub("^the ", "")
			placename = group.key_to_placename and group.key_to_placename(placename) or placename
			-- We categorize both in key, and in the larger polity that the key is part of,
			-- e.g. [[Hirakata]] goes in both "Cities in Osaka Prefecture" and
			-- "Cities in Japan".
			local divtype = value.divtype or group.default_divtype
			if type(divtype) ~= "table" then
				divtype = {divtype}
			end
			if type(placename) ~= "table" then
				placename = {placename}
			end
			for _, dt in ipairs(divtype) do
				for _, pn in ipairs(placename) do
					local place = dt .. "/" .. pn
					ensure_key(place)
					if not value.nocities then
						local retcats = {"Cities in " .. key}
						if value.containing_polity then
							table.insert(retcats, "Cities in " .. value.containing_polity)
						end
						alldata[place].city_cats = retcats
					end
					if value.poldiv then
						alldata[place].poldiv = value.poldiv
					end
					if value.miscdiv then
						alldata[place].miscdiv = value.miscdiv
					end
				end
			end
		end
	end

	-- Convert to list and sort
	local alldata_list = {}
	for key, value in pairs(alldata) do
		table.insert(alldata_list, {key, value})
		if value.aliases then
			table.sort(value.aliases)
		end
	end
	table.sort(alldata_list, function(fs1, fs2) return fs1[1] < fs2[1] end)

	-- Convert to wikitable
	local parts = {}
	table.insert(parts, '{|class="wikitable"')
	table.insert(parts, "! Placename !! Article !! Display as !! Categorize as !! City categories !! Recognized political subdivisions !! Recognized traditional subdivisions")
	for _, placename_data in ipairs(alldata_list) do
		local placename = placename_data[1]
		local data = placename_data[2]
		table.insert(parts, "|-")
		local sparts = {}
		table.insert(sparts, placename)
		table.insert(sparts, data.article or "")
		table.insert(sparts, data.display and data.display or "(same)")
		table.insert(sparts, data.cat and data.cat or "(same)")
		table.insert(sparts, data.city_cats and table.concat(data.city_cats, "; ") or "")
		local poldiv = {}
		for _, div in ipairs(data.poldiv or {}) do
			if type(div) == "string" then
				table.insert(poldiv, div)
			else
				table.insert(poldiv, div[1])
			end
		end
		table.insert(sparts, table.concat(poldiv, ", "))
		local miscdiv = {}
		for _, div in ipairs(data.miscdiv or {}) do
			if type(div) == "string" then
				table.insert(miscdiv, div)
			else
				table.insert(miscdiv, div[1])
			end
		end
		table.insert(sparts, table.concat(miscdiv, ", "))
		table.insert(parts, "| " .. table.concat(sparts, " || "))
	end
	table.insert(parts, "|}")
	return table.concat(parts, "\n")
end


function export.qualifier_table()
	local alldata_list = {}

	-- Create list
	for qualifier, display in pairs(data.placetype_qualifiers) do
		table.insert(alldata_list, {qualifier, display})
	end
	table.sort(alldata_list, function(fs1, fs2) return fs1[1] < fs2[1] end)

	-- Convert to wikitable
	local parts = {}
	table.insert(parts, '{|class="wikitable"')
	table.insert(parts, "! Qualifier !! Display as")
	for _, qualifier_data in ipairs(alldata_list) do
		local qualifier = qualifier_data[1]
		local display_as = qualifier_data[2]
		table.insert(parts, "|-")
		local sparts = {}
		table.insert(sparts, qualifier)
		table.insert(sparts, display_as == true and qualifier or "'''" .. display_as .. "'''")
		table.insert(parts, "| " .. table.concat(sparts, " || "))
	end
	table.insert(parts, "|}")
	return table.concat(parts, "\n")
end


return export
"https://si.wiktionary.org/w/index.php?title=Module:place_doc&oldid=28945" වෙතින් සම්ප්‍රවේශනය කෙරිණි