local InputContainer = require("ui/widget/container/inputcontainer")
local UIManager = require("ui/uimanager")
local InfoMessage = require("ui/widget/infomessage")
local T = require("ffi/util").template
local _ = require("gettext")
local util = require("util")

local ReaderHyphenation = InputContainer:new{
    hyph_menu_title = _("Hyphenation"),
    hyph_table = nil,
}

function ReaderHyphenation:init()
    local lang_data_file = assert(io.open("./data/hyph/languages.json"), "r")
    lang_data = json.decode(lang_data_file:read("*all"))

    self.lang_table = {}
    self.hyph_table = {}
    self.hyph_alg = cre.getSelectedHyphDict()
    for k,v in ipairs(lang_data) do
        table.insert(self.hyph_table, {
            text = v.name,
            callback = function()
                self.hyph_alg = v.filename
                UIManager:show(InfoMessage:new{
                    text = T( _("Changed hyphenation to %1."), v.name),
                })
                self.ui.document:setHyphDictionary(v.filename)
                self.ui.toc:onUpdateToc()
            end,
            checked_func = function()
                return v.filename == self.hyph_alg
            end
        })

        self.lang_table[v.language] = v.filename
        if v.aliases then
            for i,alias in ipairs(v.aliases) do
                self.lang_table[alias] = v.filename
            end
        end
    end
    self.ui.menu:registerToMainMenu(self)
end

function ReaderHyphenation:parseLanguageTag(lang_tag)
    -- Parse an RFC 5646 language tag, like "en-US" or "en".
    -- https://tools.ietf.org/html/rfc5646

    -- We are only interested in the language and region parts.
    local language = nil
    local region = nil

    for part in util.gsplit(lang_tag, "-", false) do
        if not language then
            language = string.lower(part)
        elseif string.len(part) == 2 and not string.match(part, "[^%a]") then
            region = string.upper(part)
        end
    end
    return language, region
end

function ReaderHyphenation:getDictForLanguage(lang_tag)
    -- EPUB language is an RFC 5646 language tag.
    -- http://www.idpf.org/epub/301/spec/epub-publications.html#sec-opf-dclanguage
    --
    -- FB2 language is a two-letter language code
    -- (which is also a valid RFC 5646 language tag).
    -- http://fictionbook.org/index.php/%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82_lang (in Russian)

    local language, region = self:parseLanguageTag(lang_tag)
    if not language then
        return
    end

    local dict
    if region then
        dict = self.lang_table[language .. '-' .. region]
    end
    if not dict then
        dict = self.lang_table[language]
    end
    return dict
end
function ReaderHyphenation:onPreRenderDocument(config)
    -- This is called after the document has been loaded
    -- so we can use the document language.

    local hyph_alg = config:readSetting("hyph_alg")
    if not hyph_alg then
        hyph_alg = self:getDictForLanguage(self.ui.document:getProps().language)
    end
    if hyph_alg then
        self.ui.document:setHyphDictionary(hyph_alg)
    end
    self.hyph_alg = cre.getSelectedHyphDict()
end

function ReaderHyphenation:onSaveSettings()
    self.ui.doc_settings:saveSetting("hyph_alg", self.hyph_alg)
end

function ReaderHyphenation:addToMainMenu(tab_item_table)
    -- insert table to main reader menu
    table.insert(tab_item_table.typeset, {
        text = self.hyph_menu_title,
        sub_item_table = self.hyph_table,
    })
end

return ReaderHyphenation
