local p = {}

-- Cyrillic to Latin substitution table
local c2l = {
    ["а"] = "a", ["А"] = "A",
    ["б"] = "b", ["Б"] = "B",
    ["в"] = "v", ["В"] = "V",
    ["г"] = "g", ["Г"] = "G",
    ["д"] = "d", ["Д"] = "D",
    ["ђ"] = "đ", ["Ђ"] = "Đ",
    ["е"] = "e", ["E"] = "E",
    ["ж"] = "ž", ["Ж"] = "Ž",
    ["з"] = "z", ["З"] = "Z",
    ["и"] = "i", ["И"] = "I",
    ["ј"] = "j", ["Ј"] = "J",
    ["к"] = "k", ["К"] = "K",
    ["л"] = "l", ["Л"] = "L",
    ["љ"] = "lj", ["Љ"] = "Lj",
    ["м"] = "m", ["М"] = "M",
    ["н"] = "n", ["Н"] = "N",
    ["њ"] = "nj", ["Њ"] = "Nj",
    ["о"] = "o", ["О"] = "O",
    ["п"] = "p", ["П"] = "P",
    ["р"] = "r", ["Р"] = "R",
    ["с"] = "s", ["С"] = "S",
    ["т"] = "t", ["Т"] = "T",
    ["ћ"] = "ć", ["Ћ"] = "Ć",
    ["у"] = "u", ["У"] = "U",
    ["ф"] = "f", ["Ф"] = "F",
    ["х"] = "h", ["Х"] = "H",
    ["ц"] = "c", ["Ц"] = "C",
    ["ч"] = "č", ["Ч"] = "Č",
    ["џ"] = "dž", ["Џ"] = "Dž",
    ["ш"] = "š", ["Ш"] = "Š"
}

-- Latin to Cyrillic substitution table
local l2c = {
    ["a"] = "а", ["A"] = "А",
    ["b"] = "б", ["B"] = "Б",
    ["v"] = "в", ["V"] = "В",
    ["g"] = "г", ["G"] = "Г",
    ["d"] = "д", ["D"] = "Д",
    ["đ"] = "ђ", ["Đ"] = "Ђ",
    ["e"] = "е", ["E"] = "E",
    ["ž"] = "ж", ["Ž"] = "Ж",
    ["z"] = "з", ["Z"] = "З",
    ["i"] = "и", ["I"] = "И",
    ["j"] = "ј", ["J"] = "Ј",
    ["k"] = "к", ["K"] = "К",
    ["l"] = "л", ["L"] = "Л",
    ["lj"] = "љ", ["Lj"] = "Љ", ["LJ"] = "Љ",
    ["m"] = "м", ["M"] = "М",
    ["n"] = "н", ["N"] = "Н",
    ["nj"] = "њ", ["Nj"] = "Њ", ["NJ"] = "Њ",
    ["o"] = "о", ["O"] = "О",
    ["p"] = "п", ["P"] = "П",
    ["r"] = "р", ["R"] = "Р",
    ["s"] = "с", ["S"] = "С",
    ["t"] = "т", ["T"] = "Т",
    ["ć"] = "ћ", ["Ć"] = "Ћ",
    ["u"] = "у", ["U"] = "У",
    ["f"] = "ф", ["F"] = "Ф",
    ["h"] = "х", ["H"] = "Х",
    ["c"] = "ц", ["C"] = "Ц",
    ["č"] = "ч", ["Č"] = "Ч",
    ["dž"] = "џ", ["Dž"] = "Џ", ["DŽ"] = "Џ",
    ["š"] = "ш", ["Š"] = "Ш"
}


function _cyr2lat(str)
    local lat = mw.ustring.gsub(str, "%a", c2l)
    return lat
end


function _lat2cyr(str)
    local cyr = mw.ustring.gsub(str, "%a", l2c)
    return cyr
end


function p.cyr2lat(frame)
    return _cyr2lat(frame.args[1])
end


function p.lat2cyr(frame)
    return _lat2cyr(frame.args[1])
end


function p.convert(frame)
    local lat = frame.args.latin
    local cyr = frame.args.cyrillic

    if not cyr then
        if lat then
            cyr = _lat2cyr(lat)
        else
            error("Neither Latin nor Cyrillic text is included", 0)
        end
    elseif not lat then
        lat = _cyr2lat(cyr)
    end
    
    return mw.ustring.format("\'\'%s\'\', %s", lat, cyr)
end

return p