local export = {}

local m_IPA = require("Module:IPA")
local lang = require("Module:languages").getByCode("kpy")
local rsub = mw.ustring.gsub
local rlower = mw.ustring.lower

local function phonetic(text)
	text = rlower(text)
	text = rsub(text, "ы", "ə")
	text = rsub(text, "и", "i")
	text = rsub(text, "э", "E")
	text = rsub(text, "е", "jE")
	text = rsub(text, "а", "a")
	text = rsub(text, "я", "ja")
	text = rsub(text, "у", "ʊ")
	text = rsub(text, "ю", "jʊ")
	text = rsub(text, "о", "o")
	text = rsub(text, "ё", "jo")
	text = rsub(text, "п", "p")
	text = rsub(text, "т", "t")
	text = rsub(text, "ч", "ћ")
	text = rsub(text, "к", "k")
	text = rsub(text, "ӄ", "q")
	text = rsub(text, "вʼ", "w")
	text = rsub(text, "в", "ʋ")
	text = rsub(text, "гʼ", "ʕ")
	text = rsub(text, "г", "ɣ")
	text = rsub(text, "л", "l")
	text = rsub(text, "м", "m")
	text = rsub(text, "н", "n")
	text = rsub(text, "ӈ", "ŋ")
	-- palatals
	text = rsub(text, "t([kɣŋ])", "c%1")
	text = rsub(text, "t([ьj])", "c")
	text = rsub(text, "l([ьj])", "ʎ")
	text = rsub(text, "n([ьj])", "ɲ")
	text = rsub(text, "([чћ])([ьj])", "%1")
	text = rsub(text, "й", "j")
	text = rsub(text, "ъ", "")
	
	-- glottal stop
	text = rsub(text, "^([əiEaʊo])", "ʔ%1")
	text = rsub(text, "([əiEaʊo])([əiEaʊo])", "%1ʔ%2")
	
	-- vowel phonetic
	text = rsub(text, "iŋ", "ɪŋ")
	text = rsub(text, "i$", "ɪ")
	text = rsub(text, "i ", "ɪ ")
	text = rsub(text, "Eŋ", "ɛŋ")
	text = rsub(text, "E([cћɲʎj])", "e%1")
	text = rsub(text, "aŋ", "ɑŋ")
	text = rsub(text, "a$", "ɐ")
	text = rsub(text, "a ", "ɐ ")
	text = rsub(text, "a([cћɲʎj])", "æ%1")
	text = rsub(text, "ʊŋ", "uŋ")
	text = rsub(text, "o$", "ɔ")
	text = rsub(text, "o ", "ɔ ")
	-- consonants phonetic
	text = rsub(text, "p([iɪEɛe])", "pʲ%1")
	text = rsub(text, "p$", "ʰp")
	text = rsub(text, "p ", "ʰp ")
	text = rsub(text, "ћ([kɣŋ])", "ч%1")
	text = rsub(text, "ћ$", "ч")
	text = rsub(text, "ћ ", "ч ")
	text = rsub(text, "k$", "ʰk")
	text = rsub(text, "k ", "ʰk ")
	text = rsub(text, "ʋ([iɪ])", "ʋʲ%1")
	text = rsub(text, "n([iɪ])", "nʲ%1")
	
	-- final conversions
	text = rsub(text, "([ptkqчћwʋʕɣlmnŋ])%1", "%1ː")
	text = rsub(text, "E", "e̞")
	text = rsub(text, "ч", "t͡ʃ̺")
	text = rsub(text, "ћ", "t͡ʃ")
	text = rsub(text, "ʎ", "lʲ")

	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 = lang, items = IPA_results }
end

return export