local export = {}

local lang = require("Module:languages").getByCode("as")
local sc = require("Module:scripts").getByCode("Beng")
local m_translit = require("Module:as-translit").tr
local m_IPA = require("Module:IPA")

local gsub = mw.ustring.gsub
local gmatch = mw.ustring.gmatch

local correspondences = {
    ["g"] = "ɡ", 
    ["ñ"] = "n",
    ["ṗ"] = "pʰ", ["ḃ"] = "bʱ", 
    ["y"] = "j", ["r"] = "ɹ", 
    ["h"] = "ɦ",
    ["ḱ"] = "kʰ", ["ǵ"] = "ɡʱ", 
    ["ź"] = "zʱ", ["ṫ"] = "tʰ", ["ḋ"] = "dʱ", 
    ["ŕ"] = "ɹʱ", ["ṙ"] = "ɹi",
    ["o"] = "ɔ", ["e"] = "ɛ", ["ü"] = "ʊ",
    ["ë"] = "e", ["ö"] = "o", ["ʏ"] = "oɪ", 
    ["ɵ"] = "oʊ",
    ["õ"] = "ɔ̃", ["e͂"] = "ɛ̃", ["ü͂"] = "ʊ",
    ["ë̃"] = "ẽ", ["ö̃"] = "ɔ̃", ["a͂"] = "a", ["ĩ"] = "i", ["u͂"] = "u"
}

local vowels = "aiueoüóéʏɵ"
local syllabify_pattern = "([" .. vowels .. "])([^" .. vowels .. " %.]+)([" .. vowels .. "])"

local function syllabify(text)
	for count = 1, 2 do
		text = gsub(text, syllabify_pattern, function(a, b, c)
			return a .. gsub(gsub(b, "(.)(.+)", "%1.%2"), "^([^%.]+)$", ".%1") .. c end)
	end
	return text
end

function export.link(term)
	return require("Module:links").full_link{ term = term, lang = lang, sc = sc }
end

function export.toIPA(text)
	local result = {}
	
	local translit = m_translit(text, lang, sc, "IPA")
	if not translit then
		error('The term "' .. text .. '" could not be transliterated.')
	end
	
    local translit = syllabify(translit)
	
	for character in gmatch(translit, ".") do
		table.insert(result, correspondences[character] or character)
	end
	
	result = table.concat(result)
	result = gsub(result, "([aɔ])i", "%1ɪ")
	result = gsub(result, "z%.z", "d.ʑ")
	result = gsub(result, "([" .. vowels .. "])ɦ", "%1ʱ")
	
	return result
end

function export.make(frame)
	local args = frame:getParent().args
	local pagetitle = mw.title.getCurrentTitle().text
	
	local p, results = {}, {}
	
	if args[1] then
		for index, item in ipairs(args) do
			table.insert(p, (item ~= "") and item or nil)
		end
	else
		p = { pagetitle }
	end
	
	for _, Assamese in ipairs(p) do
		table.insert(results, { pron = "/" .. export.toIPA(Assamese) .. "/" })
	end
	
	return '* ' ..   m_IPA.format_IPA_full(lang, results)
end

return export