local export = {}

local m_str_utils = require("Module:string utilities")

local gsub = m_str_utils.gsub
local U = m_str_utils.char

local fatHatan = U(0x64B)
local zabar = U(0x64E)
local zer = U(0x650)
local pesh = U(0x64F)
local tashdid = U(0x651) -- also called shadda
local jazm = "ْ"
local he = "ه"
local zwnj = U(0x200C)
local highhmz = U(0x654)
local alef_wasla = "ٱ"
local balticons = "ڃڇڑڗݜݨݩǩ"
local consonants = "ءبپتټٹثجچحخدډڈذرزژسشصضطظعغفقکگلمنؤهئ"
local consonants2 = "ءبپتټٹثجچحخدډڈذرزژسشصضطظعغفقکگلمنوؤهیئyw" .. balticons -- including semivowels
 
local ain = 'ع'
local alif = 'ا'
local ye = 'ی'
local ye2 = 'ئ'
local ye3 = 'ے' -- for balti
local vao = "و"
local function clscheck(text, lang, sc)
	return require("Module:fa-cls-translit").tr(text, lang, sc)
end
-- this has the fa-cls-translit perform the diactic check and other basic functions 

function export.tr(text, lang, sc)
	text = gsub(text, alif .. fatHatan , fatHatan)
	text = gsub(text, "([" .. consonants2 .. "])" .. alif , "%1" .. zabar .. alif)
	text = gsub(text, pesh .. vao .. "([" .. consonants .. jazm .. "])", zabar .. vao .. "%1" )
	text = gsub(text, zer .. ye .. "([" .. consonants .. jazm .. "])", zabar .. ye .. "%1" )
	-- alows an alif without a zabar to work
	text = clscheck(text, lang, sc)
	if text == nil then --prevent module from breaking if diacritic check fails
		return nil
	end
	text = gsub(text, "e" .. " ", "e-ye")
	text = gsub(text, "iy", "ēy")
	text = gsub(text, "y%-i", "ē-yi")
	text = gsub(text, "q", "ğ")
	text = gsub(text, "ww", "vv")
	text = gsub(text, "i", "e")
	text = gsub(text, "u", "o")
	text = gsub(text, "ē", "i")
	text = gsub(text, "ay([^yaâeoiu])", "ī%1")
	text = gsub(text, "ī", "ey")
	text = gsub(text, "ō", "u")
	text = gsub(text, "ā", "â")
	text = gsub(text, "w([aâeoiu])", "v%1")
	text = gsub(text, "aw", "ū")
	text = gsub(text, "w", "v")
	text = gsub(text, "ū", "ow")
	return text
end
 
return export