local export = {}
local m_com = require("Module:ug-common")

local pos_functions = {}

local lang = require("Module:languages").getByCode("ug")

local PAGENAME = mw.title.getCurrentTitle().text

local suffix_categories = {
	["形容詞"] = true,
	["副詞"] = true,
	["名詞"] = true,
	["動詞"] = true,
}

local function track(page)
	require("Module:debug").track("ug-headword/" .. page)
	return true
end

function export.make_plural_noun(singular, vv, change)
	local base, v, c = m_com.getLast(singular)
	if not v then return nil end
	if change == "yes" then
		if vv ~= nil and vv ~= "" then
			v = vv
		else
			if c == "" and (v == "ا" or v == "ە") then
				v = "ى"
			end
		end
	end
	local term = base .. v .. c
	local tongue = m_com.checkTongue(singular)
	if tongue == "front" then
		return term .. "لەر"
	elseif tongue == "back" then
		return term .. "لار"
	else
		-- [[Special:WhatLinksHere/Template:tracking/ug-headword/central vowels]]
		track("central vowels")
	end
	return nil
end

-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
	local poscat = frame.args[1] or error("未指定詞性。請在參數1処填寫。")
	
	local params = {
		["head"] = {list = true},
		["suff"] = {type = "boolean"},
	}
	
	if mw.ustring.find(PAGENAME, " ") then
		-- [[Special:WhatLinksHere/Template:tracking/ug-headword/space]]
		track("space")
	end
	
	if pos_functions[poscat] then
		for key, val in pairs(pos_functions[poscat].params) do
			params[key] = val
		end
	end
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local data = {lang = lang, pos_category = poscat, categories = {}, heads = args["head"], genders = {}, inflections = {enable_auto_translit = true}, categories = {}}
	
	if args["suff"] then
		data.pos_category = "suffixes"
		
		if suffix_categories[poscat] then
			table.insert(data.categories, lang:getCanonicalName() .. "構成" .. poscat .. "的後綴")
		else
			error("No category exists for suffixes forming " .. poscat .. ".")
		end
	end
	
	if pos_functions[poscat] then
		pos_functions[poscat].func(args, data)
	end
	
	return require("Module:headword").full_headword(data)
end

-- Display additional inflection information for a noun
pos_functions["名詞"] = {
	params = {
		[1] = {}, -- Vowel, if there is a change
		["pl"] = {}, --plural override
		["change"] = {}, -- yes or (else:no)
	},
	func = function(args, data)
		local pl = args["pl"] or nil
		local change = args["change"] or "yes"
		if pl == "-" then
			table.insert(data.inflections, {label = "[[Appendix:術語表#不可數|不可數]]"})
			table.insert(data.categories, "維吾爾語不可數名詞")
		else
			table.insert(data.categories, "維吾爾語可數名詞")
			if not pl then
				local plural = export.make_plural_noun(PAGENAME, args[1], change)
				if plural then
					pl = plural
				else
					table.insert(data.categories, "維吾爾語不規則名詞複數")
				end
			end
			if pl then
				local infl = {label = '複數', {term=pl}}
				table.insert(data.inflections, infl)
			-- else
			--	table.insert(data.categories, "Uyghur nouns needing plural inflection")
			end
		end
		
		if pl and not mw.title.new(pl).exists then
			table.insert(data.categories, "標題行有紅鏈的維吾爾語名詞")
		end
	end
}

pos_functions["專有名詞"] = {
	params = {
		[1] = {}, -- Vowel, if there is a change
		["pl"] = {}, --plural override
		["change"] = {}, -- yes or (else:no)
	},
	func = function(args, data)
		local pl = args["pl"] or nil
		local change = args["change"] or "yes"
		if pl == "-" then
			table.insert(data.inflections, {label = "[[Appendix:術語表#不可數|不可數]]"})
			table.insert(data.categories, "維吾爾語不可數專有名詞")
		else
			table.insert(data.categories, "維吾爾語可數專有名詞")
			if not pl then
				local plural = export.make_plural_noun(PAGENAME, args[1], change)
				if plural then
					pl = plural
				else
					table.insert(data.categories, "維吾爾語不規則專有名詞複數")
				end
			end
			if pl then
				local infl = {label = '複數', {term=pl}}
				table.insert(data.inflections, infl)
			-- else
			--	table.insert(data.categories, "Uyghur nouns needing plural inflection")
			end
		end
		
		if pl and not mw.title.new(pl).exists then
			table.insert(data.categories, "標題行有紅鏈的維吾爾語專有名詞")
		end
	end
}

function export.noun(frame)
	local params = {
		[1] = {}, -- Vowel, if there is a change
		["pl"] = {}, --plural override
		["head"] = {},
		["change"] = {}, -- yes or (else:no)
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)

	local data = {
		lang = lang,
		pos_category = "名詞",
		categories = {},
		heads = {args["head"]},
		inflections = {enable_auto_translit = true}
	}
	local pl = args["pl"] or nil
	local change = args["change"] or "yes"
	if pl == "-" then
		table.insert(data.inflections, {label = "[[Appendix:術語表#不可數|不可數]]"})
		table.insert(data.categories, "維吾爾語不可數名詞")
	else
		if not pl then
			local plural = export.make_plural_noun(PAGENAME, args[1], change)
			if plural then
				pl = plural
			else
				table.insert(data.categories, "維吾爾語不規則名詞複數")
			end
		end
		if pl then
			local infl = {label = '非人稱主格複數', {term=pl}}
			table.insert(data.inflections, infl)
		-- else
		--	table.insert(data.categories, "Uyghur nouns needing plural inflection")
		end
	end
	
	if pl and not mw.title.new(pl).exists then
		table.insert(data.categories, "標題行有紅鏈的維吾爾語名詞")
	end

	return require("Module:headword").full_headword(data)
end

return export