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

local export = {}
local pos_functions = {}

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

pos_functions["verbs"] = function(args, data)
	-- infinitive(s)
	local m_conj = require("Module:ko-conj").verb
	local hae = args["hae"] or m_conj(nil, { PAGENAME, irreg = args["irreg"], form = "hae" })
	if hae == "" then hae = nil end
	local hae2 = args["hae2"] or m_conj(nil, { PAGENAME, irreg = args["irreg"], form = "hae2" })
	if hae2 == "" then hae2 = nil end
	
	local infinitives = {label = "infinitive"}
	if hae then table.insert(infinitives, hae) end
	if hae2 then table.insert(infinitives, hae2) end
	if #infinitives > 0 then table.insert(data.inflections, infinitives) end
	
	-- sequential
	local hani = args["hani"] or m_conj(nil, { PAGENAME, irreg = args["irreg"], form = "hani" })
	if hani == "" then hani = nil end
	
	if hani then table.insert(data.inflections, {label = "sequential", hani}) end
end

pos_functions["adjectives"] = function(args, data)
	local m_conj = require("Module:ko-conj").adjective
	local hae = args["hae"] or m_conj(nil, { PAGENAME, irreg = args["irreg"], form = "hae" })
	if hae == "" then hae = nil end
	local hae2 = args["hae2"] or m_conj(nil, { PAGENAME, irreg = args["irreg"], form = "hae2" })
	if hae2 == "" then hae2 = nil end
	
	local infinitives = {label = "infinitive"}
	if hae then table.insert(infinitives, hae) end
	if hae2 then table.insert(infinitives, hae2) end
	if #infinitives > 0 then table.insert(data.inflections, infinitives) end
	
	-- sequential
	local hani = args["hani"] or m_conj(nil, { PAGENAME, irreg = args["irreg"], form = "hani" })
	
	if hani then table.insert(data.inflections, {label = "sequential", hani}) end
end

pos_functions["suffixes"] = function(args, data)
	local hae = args["hae"]; if hae == "" then hae = nil end
	local hae2 = args["hae2"]; if hae2 == "" then hae2 = nil end
	
	local infinitives = {label = "infinitive"}
	if hae then table.insert(infinitives, hae) end
	if hae2 then table.insert(infinitives, hae2) end
	if #infinitives > 0 then table.insert(data.inflections, infinitives) end
	
	-- sequential
	local hani = args["hani"]; if hani == "" then hani = nil end
	
	if hani then table.insert(data.inflections, {label = "sequential", hani}) end
end

pos_functions["adjective forms"] = function(args, data)
	local root = args["root"]; if root == "" then root = nil end
	local form = args["form"]; if form == "" then form = nil end
	
	if form and root then
		table.insert(data.inflections, {label = form .. " of", root})
	end
end

pos_functions["verb forms"] = pos_functions["adjective forms"]

pos_functions["determiners"] = function(args, data)
	local root = args["root"]; if root == "" then root = nil end

	if root then table.insert(data.inflections, {label = "determinative form of", root}) end
end

pos_functions["nouns"] = function(args, data)
	local count = args["count"]; if count == "" then count = nil end
	
	if count == '-' then 
		table.insert(data.inflections, "นับไม่ได้")
	elseif count then
		table.insert(data.inflections, {label = "คำลักษณนาม", count})
	end
end

-- other parts of speech: nothing special is done for adverbs, interjections, suffixes

-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
	local args = frame:getParent().args
	local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
	local hangeul_pattern = '[ᄀ-ᄒ".."ᅡ-ᅵ".."ᆨ-ᇂ" .. "ㄱ-ㆎ가-힣 ()!?-]' -- includes other punctuation that could appear in |head=
	local hanja_pattern = '[一-鿿㐀-䶿﨎﨏﨑﨓﨔﨟﨡﨣﨤﨧-﨩]'
	
	local params = {
		["head"] = {},

		[1] = {list = true},
		["hangeul"] = {},
		["hanja"] = {},
		["occasional hanja"] = {},

		["rv"] = {},
		["rr"] = {alias_of = "rv"},
		["mr"] = {},
		["y"] = {},

		["count"] = {},
		["form"] = {},
		["hae"] = {},
		["hae2"] = {},
		["hani"] = {},
		["irreg"] = {},
		["root"] = {},
	}
	args = require("Module:parameters").process(args, params)
	
	local data = {lang = lang, pos_category = poscat, categories = {}, heads = {args["head"]}, translits = {}, inflections = {}, sort_key = args["hangeul"], sc = require("Module:scripts").getByCode("Kore")}
	
	-- categorize by part of speech
	if poscat == "auxiliary verbs" then
		data.pos_category = "verbs"
		table.insert(data.categories, "คำกริยานุเคราะห์ภาษาเกาหลี")
	end
	
	if args["irreg"] then table.insert(data.inflections, { label = "irregular" }) end
	
	-- grammatical forms etc. for each respective part of speech
	if pos_functions[poscat] then
		pos_functions[poscat](args, data)
	end	
	
	-- >>> transliterations <<<
	-- if this entry is hangeul and no transliteration is provided, add auto transliteration
	-- if this entry is NOT hangeul and no translit is provided, add auto translit if there is hangeul
	local head_or_PAGENAME_no_links = require("Module:links").remove_links(args["head"] or PAGENAME)
	if args["rv"] then
		-- no need to do anything
	elseif mw.ustring.gsub(head_or_PAGENAME_no_links, hangeul_pattern, '') == "" then
		args["rv"] = lang:transliterate(head_or_PAGENAME_no_links)
	elseif args["hangeul"] then
		args["rv"] = lang:transliterate(args["hangeul"])
	else
		error('Could not produce transliteration. There may be non-hangeul characters in the entry title.')
	end
	if poscat == 'proper nouns' then
		args["rv"] = mw.ustring.upper(mw.ustring.sub(args["rv"],1,1)) .. mw.ustring.sub(args["rv"],2,-1)
	end
	
	-- 2021 August 2: transition from unhyphenated *fix page titles to hyphenated *fix page titles
	if not string.match(PAGENAME, '%-') then
		if poscat == "suffixes" then
			args["rv"] = "-" .. args["rv"]
			data.heads[1] = "—" .. (args["head"] or PAGENAME)
		elseif poscat == "prefixes" then
			args["rv"] = args["rv"] .. "-"
			data.heads[1] = (args["head"] or PAGENAME) .. "—"
		end
	end
	
	if args["rv"] then table.insert(data.translits, args["rv"]) end
	if args["mr"] then table.insert(data.translits, "แมกคูน-ไรซ์ชาวเออร์: " .. args["mr"]) end
	if args["y"] then table.insert(data.translits, "เยล: " .. args["y"]) end
	
	if args["hangeul"] then
		table.insert(data.inflections, {label = "ฮันกึล", { term = args["hangeul"], sc = require("Module:scripts").getByCode("Kore") }})
	end
	
	if args["hanja"] then
		table.insert(data.inflections, {label = "ฮันจา", { term = args["hanja"], sc = require("Module:scripts").getByCode("Kore") }})
	end
	
	if args["occasional hanja"] then
		table.insert(data.inflections, {label = "โดยปกติไม่มีฮันจา; บางครั้งใช้", { term = args["occasional hanja"], sc = require("Module:scripts").getByCode("Kore") }})
	end
	
	-- and categorize hanja terms
	if mw.ustring.match(PAGENAME, hanja_pattern) then
		if poscat == "nouns" then 
			table.insert(data.categories, "คำนามภาษาเกาหลีในอักษรจีน") 
		elseif poscat == "proper nouns" then 
			table.insert(data.categories, "คำวิสามานยนามภาษาเกาหลีในอักษรจีน") 
		end
	elseif mw.ustring.match(PAGENAME, hangeul_pattern) then
		local content = mw.title.new(PAGENAME):getContent()
		if content then
			local code = mw.ustring.match(content, '{{ko%-IPA[^}]*}}')
			if not code then code = mw.ustring.match(content, '{{ko%-ipa[^}]*}}') end
			if not code then code = mw.ustring.match(content, '{{ko%-pron[|}]') end
			if not code then table.insert(data.categories, "Korean terms without ko-IPA template") end
		end
	end
	
	-- maintenance category for hanja terms without hangeul
	if mw.ustring.match(PAGENAME, hanja_pattern) and args["hangeul"] == nil then 
		table.insert(data.categories, "ศัพท์ภาษาเกาหลีรูปฮันจาที่ขาดรูปฮันกึล")
	end
	
	return require("Module:headword").full_headword(data)
end

-- ฟังก์ชันเฉพาะกิจ

pos_functions["คำนาม"] = pos_functions["nouns"]
pos_functions["คำวิสามานยนาม"] = pos_functions["proper nouns"]
pos_functions["คำลักษณนาม"] = pos_functions["classifier"]
pos_functions["คำสรรพนาม"] = pos_functions["pronouns"]
pos_functions["คำกริยา"] = pos_functions["verbs"]
pos_functions["คำคุณศัพท์"] = pos_functions["adjectives"]
pos_functions["คำกริยาวิเศษณ์"] = pos_functions["adverbs"]
pos_functions["คำบุพบท"] = pos_functions["prepositions"]
pos_functions["คำสันธาน"] = pos_functions["conjunctions"]
pos_functions["คำอุทาน"] = pos_functions["interjections"]
pos_functions["คำอนุภาค"] = pos_functions["particles"]

return export