local export = {}

local m_IPA = require("Module:IPA")
local lang = require("Module:languages").getByCode("rsk")
local rsub = mw.ustring.gsub
local rlower = mw.ustring.lower
local rlast = require("Module:string/replace last").replace_last

local phon = {
	["а"]="a",	["б"]="b",	["в"]="v",	["г"]="ɦ",	["ґ"]="ɡ",
	["д"]="d",	["е"]="ɛ",	["є"]="jɛ",	["ж"]="ʒ",	["з"]="z",
	["и"]="i",	["ї"]="ji",	["к"]="k",	["л"]="l",	["м"]="m",
	["н"]="n",	["о"]="ɔ",	["п"]="p",	["р"]="r",	["с"]="s",
	["т"]="t",	["у"]="u",	["ф"]="f",	["х"]="x",	["ц"]="ts",
	["ч"]="tʃ",	["ш"]="ʃ",	["щ"]="ʃtʃ",["ю"]="ju",	["я"]="ja",
	["ь"]="ʲ",	["й"]="j",
}

local function phonetic(text)
	text = rlower(text)
	-- general phonology
	text = rsub(text, "тш", "чш")
	text = rsub(text, "тс", "цс")
	text = rsub(text, ".", phon)
	-- palatalisation
	text = rsub(text, "([dtln])j([aɛiɔu])", "%1ʲ%2")
	-- voicing assimilation
	local i = 0
	text = rsub(text, "b$", "p")
	text = rsub(text, "v$", "f")
	text = rsub(text, "d(ʲ?)$", "t%1")
	text = rsub(text, "z$", "s")
	text = rsub(text, "ʒ$", "ʃ")
	text = rsub(text, "ɡ$", "k")
	text = rsub(text, "ɦ$", "x")
	while i <= 5 do
		text = rsub(text, "b([pftsʃkx])", "p%1")
		text = rsub(text, "v([pftsʃkx])", "f%1")
		text = rsub(text, "d([pftsʃkx])", "t%1")
		text = rsub(text, "z([pftsʃkx])", "s%1")
		text = rsub(text, "ʒ([pftsʃkx])", "ʃ%1")
		text = rsub(text, "ɡ([pftsʃkx])", "k%1")
		text = rsub(text, "ɦ([pftsʃkx])", "x%1")
		text = rsub(text, "p([bdzʒɡ])", "b%1")
		text = rsub(text, "f([bdzʒɡ])", "v%1")
		text = rsub(text, "t([bdzʒɡ])", "d%1")
		text = rsub(text, "s([bdzʒɡ])", "z%1")
		text = rsub(text, "ʃ([bdzʒɡ])", "ʒ%1")
		text = rsub(text, "k([bdzʒɡ])", "ɡ%1")
		text = rsub(text, "x([bdzʒɡ])", "ɦ%1")
		i = i + 1
	end
	-- palatalisation
	text = rsub(text, "([dt])([ln])ʲ", "%1ʲ%2ʲ")
	text = rsub(text, "lnʲ", "lʲnʲ")
	text = rsub(text, "n([dt])ʲ", "nʲ%1ʲ")
	text = rsub(text, "n([dt])([ʃʒ])", "nʲ%1%2")
	text = rsub(text, "dʲ", "ɟ")
	text = rsub(text, "tʲ", "c")
	text = rsub(text, "lʲ", "ʎ")
	text = rsub(text, "nʲ", "ɲ")
	text = rsub(text, "ʲ", "")
	-- stress
	text = rlast(text, "([aɛiɔu])", "X%1", 1)
	text = rsub(text, "Xa", "A")
	text = rsub(text, "Xɛ", "E")
	text = rsub(text, "Xi", "I")
	text = rsub(text, "Xɔ", "O")
	text = rsub(text, "Xu", "U")
	text = rlast(text, "([aɛiɔu])", "ˈ%1", 1)
	text = rsub(text, "A", "a")
	text = rsub(text, "E", "ɛ")
	text = rsub(text, "I", "i")
	text = rsub(text, "O", "ɔ")
	text = rsub(text, "U", "u")
	text = rsub(text, "([bvɡdʒzjklmnprstfxɦʃɟcʎɲ])ˈ", "ˈ%1")
	text = rsub(text, "tˈ([sʃ])", "ˈt%1")
	text = rsub(text, "dˈ([zʒ])", "ˈd%1")
	text = rsub(text, "([sʃ])ˈ([pktcfx])", "ˈ%1%2")
	text = rsub(text, "([zʒ])ˈ([bɡdɟvɦ])", "ˈ%1%2")
	text = rsub(text, "([ptckbdɟɡ])ˈ([mnɲlʎrj])", "ˈ%1%2")
	text = rsub(text, "^([bvɡdʒzjklmnprstfxɦʃɟcʎɲ][bvɡdʒzjklmnprstfxɦʃɟcʎɲ]?[bvɡdʒzjklmnprstfxɦʃɟcʎɲ]?)ˈ", "ˈ%1")
	-- affricates
	text = rsub(text, "tʃ", "t͡ʃ")
	text = rsub(text, "dʒ", "d͡ʒ")
	text = rsub(text, "ts", "t͡s")
	text = rsub(text, "dz", "d͡z")
	-- final substitutions
	text = rsub(text, "'", "")
	text = rsub(text, "n([kɡ])", "ŋ%1")
	return text
end

function export.IPA(frame)
	local words = {}
	
	for _, word in ipairs(frame:getParent().args) do
		table.insert(words, word)
	end
	
	if #words == 0 then
		words = {mw.title.getCurrentTitle().text}
	end
	
	local IPA_results = {}
	
	for _, word in ipairs(words) do
		table.insert(IPA_results, { pron = "[" .. phonetic(word) .. "]" })
	end
	
	return m_IPA.format_IPA_full(lang, IPA_results)
end

return export