local export = {}
local PAGENAME = mw.title.getCurrentTitle().text
local lang = require("Module:languages").getByCode("shn")

local initials = {
	['ၵ'] = 'k', ['ၶ'] = 'kʰ', ['ၷ'] = 'ɡ', ['င'] = 'ŋ',
	['ၸ'] = 't͡ɕ', ['ၹ'] = 'z', ['ၺ'] = 'ɲ',
	['တ'] = 't', ['ထ'] = 'tʰ', ['ၻ'] = 'd', ['ၼ'] = 'n',
	['ပ'] = 'p', ['ၽ'] = 'pʰ', ['ၾ'] = 'f', ['ၿ'] = 'b', ['မ'] = 'm',
	['ယ'] = 'j', ['ရ'] = 'r', ['လ'] = 'l', ['ဝ'] = 'w',
	['ႀ'] = 'θ', ['သ'] = 'sʰ', ['ႁ'] = 'h', ['ဢ'] = 'ʔ',
	['သျ'] = 'ʃ', ['ၵျ'] = 'd͡ʑ', ['ၶျ'] = 't͡ɕʰ',
}

local medials = {
	[''] = '', ['ျ'] = 'j', ['ြ'] = 'r', ['ႂ'] = 'w',
}

local vowels = {
	[''] = 'a', ['ၢ'] = 'aː', ['ႃ'] = 'aː', ['ိ'] = 'i', ['ီ'] = 'iː', ['ု'] = 'u', ['ူ'] = 'uː', ['ူ*'] = 'o',
	['ေ'] = 'eː', ['ဵ'] = 'e', ['ႄ'] = 'ɛː', ['ႅ'] = 'ɛ', ['ွ'] = 'ɔ',
	['ဝ်'] = 'aw', ['ၢဝ်'] = 'aːw', ['ိဝ်'] = 'iw', ['ဵဝ်'] = 'ew', ['ႅဝ်'] = 'ɛw',
	['ို'] = 'ɯ', ['ိုဝ်'] = 'ɯː', ['ိူ'] = 'ɤ', ['ိူဝ်'] = 'ɤː', ['ူဝ်'] = 'oː', ['ေႃ'] = 'ɔː', ['ႂ်'] = 'aɰ',
	['ွႃ'] = 'ɔ̯aː', -- rare e.g. ငွႃႉ / တွႃး / တွႃႇရႃႉ / တွႃႉ / ၵွႃႇ / ၸွႃ / ၸီးပွႃးယေး / except ၵျွႃး = ၵျႃး
	['!'] = '', -- pure consonant sound
}

local finals = {
	[''] = '', ['ၵ်'] = 'k̚', ['င်'] = 'ŋ', ['တ်'] = 't̚', ['ၼ်'] = 'n',
	['ပ်'] = 'p̚', ['မ်'] = 'm', ['ၺ်'] = 'j',
}

local tones = {
	[''] = '˨˦', ['ႇ'] = '˩', ['ႈ'] = '˧˧˨', ['း'] = '˥', ['ႉ'] = '˦˨ˀ', ['ႊ'] = '˧',
	['x'] = '', -- no tone for !
}

local shn2th_initials = {
	['ၵ'] = 'ก',
	['ၶ'] = 'ข',
	['ၷ'] = 'ก',
	['င'] = 'หฺง',

	['ၸ'] = 'จ',
	['ၹ'] = 'จ',
	['ၺ'] = 'หฺญ',

	['တ'] = 'ต',
	['ထ'] = 'ถ',
	['ၻ'] = 'ด',
	['ၼ'] = 'หฺน',

	['ပ'] = 'ป',
	['ၽ'] = 'ผ',
	['ၾ'] = 'ฝ',
	['ၿ'] = 'บ',
	['မ'] = 'หฺม',

	['ယ'] = 'หฺย',
	['ရ'] = 'หฺร',
	['လ'] = 'หฺล',
	['ဝ'] = 'หฺว',

	['ႀ'] = 'ต',
	['သ'] = 'ส',
	['ႁ'] = 'ห',
	['ဢ'] = 'อ',

	['သျ'] = 'ฉ',
	['ၵျ'] = 'จ',
	['ၶျ'] = 'ฉ',

}

local shn2th_medials = {
	[''] = '',
	['ျ'] = 'ฺย',
	['ြ'] = 'ฺร',
	['ႂ'] = 'ฺว',

}

local shn2th_vowels = {
	[''] = 'ั',
	['ၢ'] = 'า',
	['ႃ'] = 'า',
	['ိ'] = 'ิ',
	['ီ'] = 'ี',
	['ု'] = 'ุ',
	['ူ'] = 'ู',
	['ူ*'] = '+โ-',

	['ေ'] = '+เ-',
	['ဵ'] = '+เ-',
	['ႄ'] = '+แ-',
	['ႅ'] = '+แ-',
	['ွ'] = 'อ',

	['ဝ်'] = '+เ-า',
	['ၢဝ်'] = 'าว',
	['ိဝ်'] = 'ิว',
	['ဵဝ်'] = '+เ-็ว',
	['ႅဝ်'] = '+แ-ว',

	['ို'] = 'ื',
	['ိုဝ်'] = 'ือ',
	['ိူ'] = '+เ-ิ',
	['ိူဝ်'] = '+เ-อ',
	['ူဝ်'] = '+โ-',
	['ေႃ'] = 'อ',
	['ႂ်'] = 'ะ-อือ',
	['ွႃ'] = 'อ-อา',

	['!'] = '',
	-- pure consonant sound
}

local shn2th_finals = {
	[''] = '',
	['ၵ်'] = 'ก',
	['င်'] = 'ง',
	['တ်'] = 'ต',
	['ၼ်'] = 'น',

	['ပ်'] = 'บ',
	['မ်'] = 'ม',
	['ၺ်'] = 'ย',

}

local shn2th_tones = {
	[''] = '๋',
	['ႇ'] = '่',
	['ႈ'] = '̄',
	['း'] = '๊',
	['ႉ'] = '้',
	['ႊ'] = '้',

	['x'] = '',
	-- no tone for !
}



function export.show(frame)

	local args = frame:getParent().args
	local text = args[1] or PAGENAME -- supports only one pronunciation
	local debug = args['d'] or nil
	local qualifier = args['q'] or nil
	local audioFile = args['a'] or args['audio'] or nil  -- not to use the expensive 'exists' property
	local ipa = {}
	local thai = {}
	local rhyme

	for syl in mw.text.gsplit(text, '[ %.%-]') do
		syl = mw.ustring.gsub(syl, 'ႆ', 'ၺ်') -- for easier detection
		local i, m, v, f, t = mw.ustring.match(syl,
			'^([ၵၶၷငၸၹၺတထၻၼပၽၾၿမယရလဝႀသႁဢ])([ျြႂ]?)([ၢႃိီုူေဵႄႅွဝ်!]*)([ၵငတၼပမၺ်]*)([ႇႈးႉႊx]?)$')
		
		if not i then
			error("Pattern did not match the syllable " .. tostring(syl) .. ".")
		end
		
		if i == 'သ' and m == 'ျ' then
			i = 'သျ'
			m = ''
		end
		if i == 'ၵ' and m == 'ျ' then
			i = 'ၵျ'
			m = ''
		end
		if i == 'ၶ' and m == 'ျ' then
			i = 'ၶျ'
			m = ''
		end
		if m == 'ႂ' and v == '်' then
			m = ''
			v = 'ႂ်'
		end
		if v == 'ူ' and f ~= '' then
			v = 'ူ*'
		end
		if v == '!' then
			t = 'x'
		end
		if debug then
			table.insert(ipa, '['..(i or '-')..']['..(m or '-')..']['..(v or '-')..']['..(f or '-')..']['..(t or '-')..']')
		else
			local missing
			for _, part in pairs {
				{ 'initial', initials, i },
				{ 'medial', medials, m },
				{ 'vowel', vowels, v },
				{ 'final', finals, f },
				{ 'tone', tones, t },
			} do
				if not part[2][part[3]] then
					missing = missing or require 'Module:array'()
					table.insert(missing, part)
				end
			end
			if missing then
				error('Data for '
					.. missing
						:map(
							function (part)
								return part[1] .. ' (' .. tostring(part[3]) .. ')'
							end)
						:concat(', ') .. (missing[2] and ' are' or ' is')
					.. ' missing.')
			end
			table.insert(ipa, initials[i] .. medials[m] .. vowels[v] .. finals[f] .. tones[t])
			rhyme = vowels[v] .. finals[f] -- This is meant to overwrite previous syllable.
		end

	end

	for syl in mw.text.gsplit(text, '[ %.%-]') do
		syl = mw.ustring.gsub(syl, 'ႆ', 'ၺ်') -- for easier detection
		local i, m, v, f, t = mw.ustring.match(syl,
			'^([ၵၶၷငၸၹၺတထၻၼပၽၾၿမယရလဝႀသႁဢ])([ျြႂ]?)([ၢႃိီုူေဵႄႅွဝ်!]*)([ၵငတၼပမၺ်]*)([ႇႈးႉႊx]?)$')

		if i == 'သ' and m == 'ျ' then
			i = 'သျ'
			m = ''
		end
		if i == 'ၵ' and m == 'ျ' then
			i = 'ၵျ'
			m = ''
		end
		if i == 'ၶ' and m == 'ျ' then
			i = 'ၶျ'
			m = ''
		end
		if m == 'ႂ' and v == '်' then
			m = ''
			v = 'ႂ်'
		end
		if v == 'ူ' and f ~= '' then
			v = 'ူ*'
		end
		if v == '!' then
			t = 'x'
		end
	

		if debug then
			table.insert(thai, '['..(i or '-')..']['..(m or '-')..']['..(t or '-')..']['..(v or '-')..']['..(f or '-')..']')

		else
			table.insert(thai, shn2th_initials[i] .. shn2th_medials[m] .. shn2th_tones[t] .. shn2th_vowels[v] .. shn2th_finals[f] )	
			end
		end


	return "* " .. (qualifier and require("Module:qualifier").format_qualifier({qualifier}) .. " " or "") ..
		require("Module:IPA").format_IPA_full { lang = lang, items = {{pron = "/" .. table.concat(ipa, ".") .. "/"}} } .. "\n" ..
		"* " .. frame:expandTemplate{title = "คำอ่านไทย", args = {table.concat(thai, ".")}} .. "\n" ..
		(audioFile and "*" .. require("Module:audio").format_audio { lang = lang, file = audioFile } .. "\n" or "") ..
		(rhyme and "*" .. require("Module:rhymes").format_rhymes { lang = lang, rhymes = {{rhyme = rhyme}} } or "") ..
		(#ipa > 0 and require("Module:utilities").format_categories({"ศัพท์ภาษาไทใหญ่ที่มี " .. #ipa .. " พยางค์"}, lang) or "")
end



return export