For use in {{ln-noun}}.


local export = {}

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

local plural_classes = {
	["1"] = "c2", ["3"] = "c4", ["7"] = "c8", ["9"] = "c10",
	["11/10"] = "c10", ["11/6"] = "c6", ["5"] = "c6", ["9/2"] = "c2", ["9/6"] = "c6", ["14/6"] = "c6"}

local plural_rules = {
		   ["1"] = {[1] = {"mo",    "ba", 3}, [2] = {"mw", "b", 3}, [3] = {"a", "b", 2}, [4] = {"", "ba", 1}},
		   ["3"] = {[1] = {"mo",  "mi", 3}, [2] = {"mw", "my", 3}},
		   ["5"] = {[1] = {"li",  "ma", 3}},
		   ["7"] = {[1] = {"e",   "bi", 2}},
		   ["9"] = {[1] = {  "",    "", 1}},
		   ["9/6"] = {[1] = { "a",  "ma", 2}, [2] = {  "",  "ma", 1}},
	   	  ["9/2"] = {[1] = {  "a",  "ba", 2}, [2] = {  "",  "ba", 1}},
	      ["11/10"] = {[1] = {"lol",  "nd", 4}, [2] = {"lob",  "mb", 4}, [3] = {"lop",  "mp", 4}, [4] = {"lom",  "m", 4}, [5] = {"lon",  "n", 4}, [6] = {"lo",  "n", 3},},
	      ["11/6"] = {[1] = {"lo", "ma", 3}},
	      ["14/6"] = {[1] = {"bo", "ma", 3}, [2] = {"bw", "m", 3}}
}

function export.noun(frame)
	local params = {
		[1] = {required=true},
		[2] = {},
		["head"] = {},
		["h"] = {alias_of = "head"}
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {lang = lang, pos_category = "nouns", categories = {}, heads = {args["head"]}, genders = {mw.text.split(args[1], "%/")[1]}, inflections = {}}
	table.insert(data.categories, lang:getCanonicalName() .. " class " .. data.genders[1] .. " nouns")
	
	if args[2] ~= "-" and plural_classes[args[1]] then
		local infl_plural = {label = "plural", accel = {form = "p", gender = plural_classes[args[1]]}, request = true}
		
		-- If no plural was provided, generate one
		if not args[2] then
			local singular = args["head"] and require("Module:links").remove_links(args["head"]) or mw.title.getCurrentTitle().text
			args[2] = export.generate_plural(singular, args[1])
		end
		
		if args[2] then	
			table.insert(infl_plural, {term = args[2], genders = {plural_classes[args[1]]}})
		end
		
		table.insert(data.inflections, infl_plural)
		
		-- colloquial plural for class 9
		if args[1] == "9" or args[1] == "9/6" then
			local infl_coll_plural = {label = "colloquial plural", accel = {form = "p", gender = "c2"}, request = true}
			local singular = args["head"] and require("Module:links").remove_links(args["head"]) or mw.title.getCurrentTitle().text
			local coll_plural = export.generate_plural(singular, "9/2")
			table.insert(infl_coll_plural, {term = coll_plural, genders = {"c2"}})
			table.insert(data.inflections, infl_coll_plural)
		end
	end
	
	return require("Module:headword").full_headword(data)
end


function match_case(string1, string2)
	local c1 = mw.ustring.sub(string1, 1, 1)
	local c2 = mw.ustring.sub(string2, 1, 1)
	
	if (mw.ustring.lower(c1) == c1) then
		return mw.ustring.lower(c2) .. mw.ustring.sub(string2, 2)
	else
		return mw.ustring.upper(c2) .. mw.ustring.sub(string2, 2)
	end
end


function export.generate_plural(singular, class)
	if plural_rules[class] then
		for k, v in ipairs(plural_rules[class]) do
			if mw.ustring.find(mw.ustring.lower(singular), "^" .. v[1]) then
				return match_case(singular, v[2] .. mw.ustring.sub(singular, v[3]))
			end
		end
	end
end

function export.verb(frame)
	local params = {
		[1] = {},
		["head"] = {},
		["h"] = {alias_of = "head"}
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local head = args["head"] or mw.title.getCurrentTitle().text
	local inf = args[1] or "ko"..head
	
	local data = {lang = lang,
		pos_category = "verbs",
		categories = {},
		heads = {"-"..head},
		inflections = {{label="infinitive", accel = {form = "infinitive"}, inf}}}

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

return export