-- มอดูลนี้แตกต่างจากของ en อย่างมาก เนื่องจากการตั้งชื่อหมวดหมู่ต่างกัน
local export = {}

local find = mw.ustring.find
local match = mw.ustring.match
local sub = mw.ustring.sub
local gsub = mw.ustring.gsub
local len = mw.ustring.len

-- เขียนใหม่
local affixtype_tpl = {
	["อุปสรรค"] = "prefixcat",
	["ปัจจัย"] = "suffixcat",
	["อาคม"] = "infixcat",
	["หน่วยคำเติมคร่อม"] = "circumfixcat",
	["หน่วยคำเติมเชื่อม"] = "interfixcat",
}

-- เขียนใหม่
local function getInitialLang(PAGENAME)

	local getByCanonicalName = require("Module:languages").getByCanonicalName
	local langName, lang, scName, sc
	if find(PAGENAME, "^ศัพท์ข้ามภาษา") or find(PAGENAME, "^ศัพท์ภาษา.+") then
		langName = match(PAGENAME, "^ศัพท์(ข้ามภาษา)")
		lang = (langName and getByCanonicalName(langName) or nil)
		if not lang then
			langName = match(PAGENAME, "^ศัพท์ภาษา(.+)ที่")
			lang = (langName and getByCanonicalName(langName) or nil)
			if not lang then
				langName = match(PAGENAME, "^ศัพท์ภาษา(.+)แบ่ง") 
				lang = (langName and getByCanonicalName(langName) or nil)
			end
		end
	elseif find(PAGENAME, "ข้ามภาษา$") or find(PAGENAME, "ภาษา.+$") then
		langName = match(PAGENAME, "(ข้ามภาษา)$")
		lang = (langName and getByCanonicalName(langName) or nil)
		if not lang then
			langName = match(PAGENAME, "ภาษา(.+)$")
			lang = (langName and getByCanonicalName(langName) or nil)
			if not lang then
				langName, scName = match(PAGENAME, "ภาษา(.+)ในอักษร(.+)$")
				lang = (langName and getByCanonicalName(langName) or nil)
				sc = (scName and require("Module:scripts").getByCanonicalName(scName) or nil)
			end
		end
	end
	return lang, sc

end

-- เขียนใหม่
local function getSource(sourcename)

	local source
	if find(sourcename, "ตระกูลภาษา") or find(sourcename, "กลุ่มภาษา") then
		sourcename = gsub(sourcename, "ตระกูลภาษา", "")
		sourcename = gsub(sourcename, "กลุ่มภาษา", "")
		source = require("Module:families").getByCanonicalName(sourcename)
	else
		sourcename = gsub(sourcename, "ภาษา", "")
		source = require("Module:etymology languages").getByCanonicalName(sourcename) or require("Module:languages").getByCanonicalName(sourcename)
	end
	return source

end

function export.show(frame)
	require("Module:parameters").process(frame:getParent().args, {})
	local PAGENAME = mw.title.getCurrentTitle().text
	
	if mw.title.getCurrentTitle().nsText == "แม่แบบ" then
		return "(This template should be used on pages in the หมวดหมู่: namespace.)"
	elseif mw.title.getCurrentTitle().nsText ~= "หมวดหมู่" then
		error("This template/module can only be used on pages in the หมวดหมู่: namespace.")
	end
	
	-- เขียนใหม่ [ภาษา]:[ราก|สืบ|ยืม|แปลตรง][ภาษา] หรือ [ภาษา]:[หัวข้อ]
	local sourcename, source 
	if find(PAGENAME, "^ข้ามภาษา:.") or find(PAGENAME, "^ภาษา.+:.") then -- มีชื่อภาษานำหน้า
		local langName, label = match(PAGENAME, "^(ข้ามภาษา):(.+)$")
		local code = (langName and "mul" or nil)
		if code == nil then
			langName, label = match(PAGENAME, "^ภาษา(.+):(.+)$")
			code = (langName and require("Module:languages").getByCanonicalName(langName):getCode() or nil)
		end
		if  find(label, "^รากศัพท์จาก") then
			sourcename = match(label, "^รากศัพท์จาก(.+)$")
			source = getSource(sourcename)
			if code and source then
				return frame:expandTemplate{title = "derived cat", args = {code, source:getCode()}}
			end
		elseif  find(label, "^สืบทอดจาก") then
			sourcename = match(label, "^สืบทอดจาก(.+)$")
			source = getSource(sourcename)
			if code and source then
				return frame:expandTemplate{title = "inherited cat", args = {code, source:getCode()}}
			end
		elseif  find(label, "^ยืมจาก") then
			sourcename = match(label, "^ยืมจาก(.+)$")
			source = getSource(sourcename)
			if code and source then
				return frame:expandTemplate{title = "borrowed cat", args = {code, source:getCode()}}
			end
		elseif  find(label, "^แปลตรงตัวจาก") then
			sourcename = match(label, "^แปลตรงตัวจาก(.+)$")
			source = getSource(sourcename)
			if code and source then
				return frame:expandTemplate{title = "calqued cat", args = {code, source:getCode()}}
			end
		else
			return frame:expandTemplate{title = "topic cat", args = {code, label}}
		end
	else -- ไม่มีชื่อภาษานำหน้า
		if find(PAGENAME, "^รากศัพท์จาก") then
			sourcename = match(PAGENAME, "^รากศัพท์จาก(.+)$")
			source = getSource(sourcename)
			if source then
				return frame:expandTemplate{title = "derived cat", args = {nil, source:getCode()}}
			end
		elseif find(PAGENAME, "^สืบทอดจาก") then
			sourcename = match(PAGENAME, "^สืบทอดจาก(.+)$")
			source = getSource(sourcename)
			if source then
				return frame:expandTemplate{title = "inherited cat", args = {nil, source:getCode()}}
			end
		elseif find(PAGENAME, "^ยืมจาก") then
			sourcename = match(PAGENAME, "^ยืมจาก(.+)$")
			source = getSource(sourcename)
			if source then
				return frame:expandTemplate{title = "borrowed cat", args = {nil, source:getCode()}}
			end
		elseif find(PAGENAME, "^แปลตรงตัวจาก") then
			sourcename = match(PAGENAME, "^แปลตรงตัวจาก(.+)$")
			source = getSource(sourcename)
			if source then
				return frame:expandTemplate{title = "calqued cat", args = {nil, source:getCode()}}
			end
		end
	end
	
	-- บล็อก [ชื่อบล็อกยูนิโคด]
	if find(PAGENAME, "^บล็อก ") then
		return require("Module:category tree/blocks"):contents(PAGENAME)
	end

	local lang, sc = getInitialLang(PAGENAME)
	--escape dash before use
	local label = (lang and gsub(PAGENAME, gsub(lang:getCategoryName(), "%-", "%-"), "") or PAGENAME)
	label = (sc and gsub(label, "ใน" .. sc:getCategoryName(), "") or label)

	for affixtype, affixtpl in pairs(affixtype_tpl) do
		if find(label, "^.+ที่เติม" .. affixtype .. " .") then
			local pos, after = match(label, "^(.+)ที่เติม" .. affixtype .. " (.+)$")
			
			if pos == "ศัพท์" then
				pos = nil
			end
			
			local term, id
			
			if find(after, ". %([^()]+%)$") then
				term, id = match(after, "^(.+) %(([^()]+)%)$")
			else
				term = after
			end
			
			return frame:expandTemplate{title = affixtpl, args = {lang:getCode(), term, pos = pos, id = id}}
		end
	end
	
	--[[
	if lang then
		for _, nametype in ipairs({"ชื่อสกุล", "ชื่อผู้ชาย", "ชื่อผู้หญิง"}) do
			local sourcename = match(label, "^" .. nametype .. "จาก(.+)$")
			
			if sourcename then
				local source = require("Module:languages").getByCanonicalName(sourcename)
				
				if source then
					return frame:expandTemplate{title = "nameboiler", args = {nametype, lang:getCode(), source:getCode()}}
				end
			end
		end
	end
	--]]
	
	if lang and lang:getCode() == "ja" and find(label, "^ศัพท์ที่สะกดด้วย .+ ออกเสียง .+$") then
		local term, reading = match(label, "^ศัพท์ที่สะกดด้วย (.+) ออกเสียง (.+)$")
		return frame:expandTemplate{title = "ja-readingcat", args = {term, reading}}
	end
	
	if find(label, "^ศัพท์ที่สะกดด้วย .+") then
		local term = match(label, "^ศัพท์ที่สะกดด้วย (.+)$")
		return frame:expandTemplate{title = "charactercat", args = {lang:getCode(), term}}
	end
	
	--[[
	if PAGENAME == "Phrasebooks by language" then
		return frame:expandTemplate{title = "pbcatboiler", args = {}}
	elseif label == "phrasebook" then
		return frame:expandTemplate{title = "pbcatboiler", args = {lang:getCode()}}
	elseif find(label, "^phrasebook/.") then
		label = match(label, "^phrasebook/(.+)$")
		return frame:expandTemplate{title = "pbcatboiler", args = {lang:getCode(), label}}
	end
	--]]
	
	if lang then
		if sc then
			return frame:expandTemplate{title = "poscatboiler", args = {lang:getCode(), label, sc = sc:getCode()}}
		else
			return frame:expandTemplate{title = "poscatboiler", args = {lang:getCode(), label}}
		end
		--return lang:getCode() .. label .. (sc and sc:getCode() or "")
	end
	
	if find(label, "แบ่งตามภาษา$") then
		local label = mw.getContentLanguage():lcfirst(match(label, "^(.+)แบ่งตามภาษา$"))
		return frame:expandTemplate{title = "poscatboiler", args = {nil, label}}
	end
	
	return frame:expandTemplate{title = "topic cat", args = {nil, label}}
end

return export