local m_labeldata = mw.loadData("Module:labels/data")
local m_utilities = require("Module:utilities")
local m_links = require("Module:links")

local export = {}

local function show_categories(data, lang, script, sort_key, script2, sort_key2, term_mode)
	local categories = {}
	local categories2 = {}
	
	local lang_code = lang:getCode()
	local canonical_name = lang:getCanonicalName()
	
	local topical_categories = data.topical_categories or {}
	local sense_categories = data.sense_categories or {}
	local pos_categories = data.pos_categories or {}
	local regional_categories = data.regional_categories or {}
	local plain_categories = data.plain_categories or {}
	
	for i, cat in ipairs(topical_categories) do
		table.insert(categories, lang_code .. ":" .. cat)
		
		if script then
			table.insert(categories, lang_code .. ":" .. cat .. " in " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, lang_code .. ":" .. cat .. " in " .. script2 .. " script")
		end
	end
	
	for i, cat in ipairs(sense_categories) do
		cat = (term_mode and cat .. " terms" ) or "terms with " .. cat .. " senses"
		table.insert(categories, canonical_name .. " " .. cat)
		
		if script then
			table.insert(categories, canonical_name .. " " .. cat .. " in " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, canonical_name .. " " .. cat .. " in " .. script2 .. " script")
		end
	end

	for i, cat in ipairs(pos_categories) do
		table.insert(categories, canonical_name .. " " .. cat)
		
		if script then
			table.insert(categories, canonical_name .. " " .. cat .. " in " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, canonical_name .. " " .. cat .. " in " .. script2 .. " script")
		end
	end
	
	for i, cat in ipairs(regional_categories) do
		table.insert(categories, cat .. " " .. canonical_name)
		
		if script then
			table.insert(categories, cat .. " " .. canonical_name .. " in " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, cat .. " " .. canonical_name .. " in " .. script2 .. " script")
		end
	end
	
	for i, cat in ipairs(plain_categories) do
		table.insert(categories, cat)
		
		if script then
			table.insert(categories, cat .. " in " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, cat .. " in " .. script2 .. " script")
		end
	end
	
	return m_utilities.format_categories(categories, lang, sort_key) .. m_utilities.format_categories(categories2, lang, sort_key2)
end

function export.show_labels(labels, lang, script, script2, sort_key, sort_key2, nocat, term_mode)
	if #labels < 1 then
		if mw.title.getCurrentTitle().nsText == "Template" then
			labels = {"example"}
		else
			error("You must specify at least one label.")
		end
	end
	
	-- Show the labels
	local omit_preComma = false
	local omit_postComma = true
	local omit_preSpace = false
	local omit_postSpace = true
	
	local lang_code = lang:getCode()
	local canonical_name = lang:getCanonicalName()
	
	local alias
	
	for i, label in ipairs(labels) do
		omit_preComma = omit_postComma
		omit_postComma = false
		omit_preSpace = omit_postSpace
		omit_postSpace = false
		
		local deprecated = false
		if m_labeldata.deprecated[label] then
			deprecated = true
		end
		if m_labeldata.aliases[label] then
			alias = label
			label = m_labeldata.aliases[label]
		end
		if m_labeldata.deprecated[label] then
			deprecated = true
		end
		
		local data = m_labeldata.labels[label] or {}
		
		if data.track then
			require("Module:debug").track("labels/label/" .. label)
		end
		
		local languages = data.languages
		if languages and not languages[lang_code] then
			-- [[Special:WhatLinksHere/Template:tracking/labels/incorrect-language]]
			require("Module:debug").track("labels/incorrect-language")
			mw.log(lang_code .. ":" .. label)
			--[[	Do not use the data in the table if the current language
					is not in the "languages" list.	|	Do not use the data in the table if the current language
					is not in the "languages" list.	]]
			label = alias or label
			data = {}
		end
		
		if data.special_display then
			local function add_language_name(str)
				if str == "canonical_name" then
					return canonical_name
				else
					return ""
				end
			end
			
			label = mw.ustring.gsub(data.special_display, "<([^>]+)>", add_language_name)
		else
			if data.glossary then
				local glossary_entry = type(data.glossary) == "string" and data.glossary or label
				label = "[[Appendix:Glossary#" .. glossary_entry .. "|" .. label .. "]]"
			elseif data.Wikipedia then
				Wikipedia_entry = type(data.Wikipedia) == "string" and data.Wikipedia or label
				label = "[[w:" .. Wikipedia_entry .. "|" .. label .. "]]"
			else
				label = data.display or label
			end
		end
		
		local omit_comma = omit_preComma or data.omit_preComma
		omit_postComma = data.omit_postComma
		local omit_space = omit_preSpace or data.omit_preSpace
		omit_postSpace = data.omit_postSpace
		
		if deprecated then
			label = '<span class="deprecated-label">' .. label .. '</span>'
			if not nocat then
				label = label .. m_utilities.format_categories({ "Entries with deprecated labels" }, lang)
			end
		end
		
		label = (omit_comma and "" or '<span class="ib-comma">,</span>') .. (omit_space and "" or "&#32;") .. label
		
		labels[i] = label .. (nocat and "" or show_categories(data, lang, script, sort_key, script2, sort_key2, term_mode))
	end
	
	return
		"<span class=\"ib-brac\">(</span><span class=\"ib-content\">" ..
		table.concat(labels, "") ..
		"</span><span class=\"ib-brac\">)</span>"
end

function export.printConflicts(frame)
	local replacements = m_labeldata.replacements
	
	local output = {"; labels:"}
	
	local labels = {}
	
	for label, data in pairs(replacements.labels) do
		local lang
		if data.languages then
			langCode = data.languages[1]
			lang = require("Module:languages").getByCode(langCode)
		end
		
		local canonicalName
		if lang then
			canonicalName = lang.getCanonicalName()
		end
		
		table.insert(labels, label)
		
		if langCode or canonicalName then
			table.insert(output, " (")
		end
		
		if langCode then
			table.insert(output, "<code>" .. langCode .. "</code>")
		end
		
		if canonicalName then
			if langCode then
				table.insert(output, ", ")
			end
			
			table.insert(output, canonicalName)
		end
		
		if langCode or canonicalName then
			table.insert(output, ")")
		end
	end
	
	table.sort(labels)
	
	for _, label in ipairs(labels) do
		table.insert(output, "\n* " .. label)
	end
	
	return table.concat(output)
end

return export