local export = {}
local m_links = require("Module:links")
local zh = require("Module:languages").getByCode("zh")

local variety_list = {
	"Classical", "Formal", "Taxonomic",
	"Northeastern Mandarin", "Jilu Mandarin", "Jiaoliao Mandarin",
	"Central Plains Mandarin", "Lanyin Mandarin",
	"Southwestern Mandarin", "Jianghuai Mandarin",
	"Mandarin", "Cantonese", "Gan", "Hakka", "Huizhou", "Jin", "Jiuxing Yumin",
	"Northern Min", "Eastern Min", "Southern Min", "Puxian Min", "Central Min", "Shaojiang Min", "Zhongshan Min",
	"Southern Pinghua", "Northern Pinghua", "Shehua", "Waxiang", "Wu", "Xiang", "Xiangnan Tuhua", "Yuebei Tuhua"
}

local variety_list_th = {
	["Classical"]="คลาสสิก", ["Formal"]="ทางการ", ["Taxonomic"]="ชื่ออนุกรมวิธาน",
	["Northeastern Mandarin"]="จีนกลางตะวันออกเฉียงเหนือ", ["Jilu Mandarin"]="จีนกลางแบบจี้หลู่", ["Jiaoliao Mandarin"]="จีนกลางแบบเจียวเหลียว",
	["Central Plains Mandarin"]="จีนกลาง", ["Lanyin Mandarin"]="จีนกลางแบบหลันอิ๋น",
	["Southwestern Mandarin"]="จีนกลางตะวันตกเฉียงใต้", ["Jianghuai Mandarin"]="จีนกลางแบบเจียงหวย",
	["Mandarin"]="จีนกลาง", ["Cantonese"]="กวางตุ้ง", ["Gan"]="กั้น", ["Hakka"]="แคะ", ["Huizhou"]="ฮุ่ยโจว", ["Jin"]="จิ้น", ["Jiuxing Yumin"]="จิ่วซิ่งยฺหวีหมิน",
	["Northern Min"]="หมิ่นเหนือ", ["Eastern Min"]="หมิ่นตะวันออก", ["Southern Min"]="หมิ่นใต้", ["Puxian Min"]="หมิ่นแบบผูเซียน",
	["Central Min"]="หมิ่นตอนกลาง", ["Shaojiang Min"]="หมิ่นแบบเซ่าเจียง", ["Zhongshan Min"]="หมิ่นแบบจงซัน",
	["Southern Pinghua"]="ผิงใต้", ["Northern Pinghua"]="ผิงเหนือ", ["Shehua"]="เซอ", ["Waxiang"]="หวาเซียง", ["Wu"]="อู๋", ["Xiang"]="เซียง", ["Xiangnan Tuhua"]="TuhuaแบบXiangnan", ["Yuebei Tuhua"]="TuhuaแบบYuebei"
}

local variety_colour = {
	["Classical"]				= "FAF0F2",
	["Formal"]					= "FAF0F2",
	["Taxonomic"]				= "FAF0F2",
	["Northeastern Mandarin"]	= "FAF5F0",
	["Jilu Mandarin"]			= "FAF5F0",
	["Jiaoliao Mandarin"]		= "FAF5F0",
	["Central Plains Mandarin"]	= "FAF5F0",
	["Lanyin Mandarin"]			= "FAF5F0",
	["Southwestern Mandarin"]	= "FAF5F0",
	["Jianghuai Mandarin"]		= "FAF5F0",
	["Mandarin"]				= "FAF5F0",
	["Cantonese"]				= "F0F5FA",
	["Gan"]						= "F0FAF3",
	["Hakka"]					= "FAF0F6",
	["Huizhou"]					= "FAF9F0",
	["Jin"]						= "FAF5F0",
	["Jiuxing Yumin"]			= "FAF0FE",
	["Northern Min"]			= "F7FAF0",
	["Eastern Min"]				= "F7FAF0",
	["Southern Min"]			= "F7FAF0",
	["Puxian Min"]				= "F7FAF0",
	["Central Min"]				= "F7FAF0",
	["Shaojiang Min"]			= "F7FAF0",
	["Zhongshan Min"]			= "F7FAF0",
	["Southern Pinghua"]		= "F0F5FA",
	["Northern Pinghua"]		= "F0F5FA",
	["Shehua"]					= "FAF0F6",
	["Waxiang"]					= "F0FAF6",
	["Wu"]						= "F4F0FA",
	["Xiang"]					= "F0F2FA",
	["Xiangnan Tuhua"]			= "F0F9FA",
	["Yuebei Tuhua"]			= "F0F9FA",
}

local special_note = {
	["Classical"] = "[[w:ภาษาจีนคลาสสิก|คลาสสิก]]",
	["Formal"] = "ทางการ <small>([[w:Written vernacular Chinese|Written Standard Chinese]])</small>",
	["Taxonomic"] = "ชื่ออนุกรมวิธาน",
}

function export.main(frame)
	local data = {}
	local args = frame:getParent().args
	local pagename = mw.title.getCurrentTitle().text
	local target_page = args[1] or pagename
	local resource_page = "Module:zh/data/dial-syn/" .. target_page
	local m_syndata
	if mw.title.new(resource_page).exists then
		m_syndata = require(resource_page).list
	else
		return frame:expandTemplate{ title = "Template:zh-dial/uncreated", args = { target_page } }
	end
	
	--allow alternative title linking for sum-of-parts tables
	local title = m_syndata["title"] and m_syndata["title"] ~= "" and m_syndata["title"] or target_page
	
	local main_title = m_links.full_link( { term = title:gsub("[0-9%-]", "") .. "//", lang = zh, tr = "-" } )
	
	local syn_table = { [=[
	<div class="NavFrame" style="border:0px; max-width: 40em; text-align:center;"><div class="NavHead" style="font-size:105%; border:1px solid #aaaaaa; margin-left:-1px; background-color:#CCCCFF; text-align:center;" cellpadding="3">คำพ้องความในภาษาถิ่นของ ]=] ..
		main_title .. ' (“' .. m_syndata["meaning"] .. '”) ' ..
		"[[Template:zh-dial-map/" .. target_page .. '|<small>&#91;แผนที่&#93;</small>]]\n' .. [=[</div><div class="NavContent"> 
	{| class="wikitable" style="margin:0; text-align:center; width: 100%"
	|-
	! style="background:#E8ECFA" | วิธภาษา
	! style="background:#E8ECFA" | ที่ตั้ง
	! style="background:#E8ECFA" | คำ]=] .. [=[
	<div style="float: right; clear: right; font-size:60%"><span class="plainlinks">[]=] ..
		tostring(mw.uri.fullUrl("Module:zh/data/dial-syn/" .. target_page, { ["action"] = "edit" })) ..
	' แก้ไข]</span></div>' }
	
	local note = m_syndata["note"]
	if m_syndata["Formal"][1] == "" then
		m_syndata["Formal"] = { target_page }
	elseif m_syndata["Formal"][1] == "-" then
		m_syndata["Formal"] = nil
	end

	local m_dialdata = require("Module:zh/data/dial")
	local variety = ""
	local current_variety = ""
	local location_name = ""
	local location_link = ""
	local colour = ""
	local exists = {}
	local variety_count = {}
	local formatted_synonyms = {}
	local loc = {}
	local cur = {}
	for i, v in pairs(variety_list) do
		variety_count[v] = 0
	end

	for i = 1,#m_dialdata,1 do
		loc = m_dialdata[i]
		cur = m_syndata[loc.key] or {""}
		if cur[1] == "" then
			exists[i] = false
		else
			exists[i] = true
			variety = loc.group
			variety_count[variety] = variety_count[variety] + 1
		end
	end
	
	for i = 1,#exists,1 do
		if exists[i] then
			loc = m_dialdata[i]
			variety = loc.group
			location_name = (loc.english or loc.key):gsub("(%(.*%))", "<small>%1</small>")
			location_link = loc.link or loc.key
			formatted_synonyms = {}
			for i, synonym in ipairs(m_syndata[loc.key]) do
				local synonym_note = mw.text.split(synonym, ":")
				local synonym_etym = mw.text.split(synonym_note[1], "_")
				local syn, etym, note = synonym_etym[1], synonym_etym[2], synonym_note[2]
				local synonym_link = m_links.full_link( {
						term = syn .. (etym and string.format("#รากศัพท์ %s", etym) or "") .. "//",
						alt = etym and (syn .. string.format("<sub>%s</sub>", etym)) .. "//",
						lang = zh,
						tr = "-"
					} )
				if note == "GT" then
					require('Module:debug/track')("zh-dial-GT")
				end
				note = note and ' <span style="font-size:60%"><i>' .. note .. '</i></span>' or ""
				table.insert(formatted_synonyms, synonym_link .. note)
			end
			table.insert(syn_table, "\n|-")
			if variety ~= current_variety then
				current_variety = variety
				colour = variety_colour[variety]
				table.insert(syn_table, "\n!rowspan=" .. variety_count[variety] .. (special_note[variety] and " colspan=2" or "") .. 
				' style="background:#' .. colour .. '"| ' .. (special_note[variety] or variety_list_th[variety])) --Thai name here
			end
			table.insert(syn_table,
				((location_name and not special_note[variety]) and ('\n|style="background:#' .. colour .. '"| ' .. 
				'[[w:' .. location_link .. '|' .. location_name .. ']]') or '') ..
				'\n|style="background:#' .. colour .. '"| ' ..
				table.concat(formatted_synonyms, ", "))
		end
	end
	
	if note and note ~= "" then
		table.insert(syn_table, '\n|-\n! style="background:#FFF7FB; padding-top:5px; padding-bottom: 5px" | ' ..
			"<small>หมายเหตุ</small>\n| colspan=2|<small><i>" .. note .. "</i></small>")
	end
	
	table.insert(syn_table, '\n|}</div></div>')
	
	return table.concat(syn_table, "")
end

return export