local export = {}

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

local F = "[eéiy]"
local C = "[bdfɡxjklwmnprstvzʒʃŋɲɕʑʲ]"
local V = "[aõãɛeɜɔoɞu]"
local Vi = "[aõãɛeɜɔoɞui]"
local T = "[ptsʃɕkx]"
local D = "[bdzʒʑɡ]"

local di = {
	["ch"]="x",	["cz"]="tʃ", ["rz"]="r̝", ["sz"]="ʃ",
}

local phon = {
	["a"]="a",	["ą"]="õ",	["ã"]="ã",	["b"]="b",
	["c"]="ts", ["d"]="d",	["e"]="ɛ",	["é"]="e",
	["ë"]="ɜ",	["f"]="f",	["g"]="ɡ",	["h"]="x",
	["i"]="i",	["j"]="j",	["k"]="k",	["l"]="l",
	["ł"]="w",	["m"]="m",	["n"]="n",	["ń"]="ɲ",
	["o"]="ɔ",	["ò"]="wɛ",	["ó"]="o",	["ô"]="ɞ",
	["p"]="p",	["r"]="r",	["s"]="s",	["t"]="t",
	["u"]="u",	["ù"]="wu",	["w"]="v",	["y"]="i",
	["z"]="z",	["ż"]="ʒ",
}

local function phonemic(text)
	text = rlower(text)
	-- basic phonology
	text = rsub(text, "..", di)
	text = rsub("1" .. text, "..", di)
	text = rsub("1" .. text, "..", di)
	text = rsub(text, "1", "")
	text = rsub(text, ".", phon)
	text = rsub(text, "n([kɡx])", "ŋ%1")
	text = rsub(text, "([kɡxvfpbm])o", "%1wo")
	text = rsub(text, "vw", "w")
	-- palatalisation
	text = rsub(text, "(" .. C .. ")i(" .. V .. ")", "%1j%2")
	text = rsub(text, "r̝i(" .. V .. ")", "r̝j%2")
	text = rsub(text, "(" .. C .. ")(" .. F .. ")", "%1ʲ%2")
	text = rsub(text, "r̝(" .. F .. ")", "r̝ʲ%1")
	text = rsub(text, "nʲ", "ɲ")
	text = rsub(text, "nj", "ɲ")
	text = rsub(text, "ʃʲ", "ɕ")
	text = rsub(text, "ʒʲ", "ʑ")
	text = rsub(text, "jʲ", "j")
	-- voicing
	text = rsub(text, "b$", "p")
	text = rsub(text, "d$", "t")
	text = rsub(text, "ɡ$", "k")
	text = rsub(text, "z$", "s")
	text = rsub(text, "v$", "f")
	text = rsub(text, "ʒ$", "ʃ")
	text = rsub(text, "ʑ$", "ɕ")
	text = rsub(text, "br̝$", "pr̝")
	text = rsub(text, "dr̝$", "tr̝")
	text = rsub(text, "ɡr̝$", "kr̝")
	text = rsub(text, "zr̝$", "sr̝")
	text = rsub(text, "vr̝$", "fr̝")
	text = rsub(text, "ʒr̝$", "ʃr̝")
	text = rsub(text, "ʑr̝$", "ɕr̝")
	text = rsub(text, "r̝$", "r̝̊")
	local i = 0
	while i <= 5 do
		text = rsub(text, "b(" .. T .. ")", "p%1")
		text = rsub(text, "d(" .. T .. ")", "t%1")
		text = rsub(text, "ɡ(" .. T .. ")", "k%1")
		text = rsub(text, "z(" .. T .. ")", "s%1")
		text = rsub(text, "v(" .. T .. ")", "f%1")
		text = rsub(text, "ʒ(" .. T .. ")", "ʃ%1")
		text = rsub(text, "ʑ(" .. T .. ")", "ɕ%1")
		text = rsub(text, "p(" .. D .. ")", "b%1")
		text = rsub(text, "t(" .. D .. ")", "d%1")
		text = rsub(text, "k(" .. D .. ")", "ɡ%1")
		text = rsub(text, "s(" .. D .. ")", "z%1")
		text = rsub(text, "f(" .. D .. ")", "v%1")
		text = rsub(text, "ʃ(" .. D .. ")", "ʒ%1")
		text = rsub(text, "ɕ(" .. D .. ")", "ʑ%1")
		i = i + 1
	end
	text = rsub(text, "(" .. T .. ")v", "%1f")
	text = rsub(text, "(" .. T .. ")r̝", "%1r̝̊") 
	-- stress
	if mw.ustring.find(text, "'") == nil then
		text = "ˈ" .. text
	end
	text = rsub(text, "(" .. Vi .. ")'", "'%1")
	text = rsub(text, "^(" .. C .. "+ʲ?)'", "'%1")
	text = rsub(text, " (" .. C .. "+ʲ?)'", " '%1")
	text = rsub(text, "(" .. C .. "ʲ?)'", "'%1")
	text = rsub(text, "'", "ˈ")
	-- affricates
	text = rsub(text, "t([sɕʃ])", "t͡%1")
	text = rsub(text, "d([zʑʒ])", "d͡%1")
	-- suffixes
	text = rsub(text, "^ˈ%-", "-")
	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 = "/" .. phonemic(word) .. "/" })
	end
	
	return m_IPA.format_IPA_full { lang = lang, items = IPA_results }
end

return export