local InputContainer = require("ui/widget/container/inputcontainer")
local InputDialog = require("ui/widget/inputdialog")
local UIManager = require("ui/uimanager")
local Event = require("ui/event")
local _ = require("gettext")
local SkimToWidget = require("frontend/apps/reader/skimtowidget")

local ReaderGoto = InputContainer:new{
    goto_menu_title = _("Go to"),
    skim_menu_title = _("Skim to"),
}

function ReaderGoto:init()
    self.ui.menu:registerToMainMenu(self)
end

function ReaderGoto:addToMainMenu(tab_item_table)
    -- insert goto command to main reader menu
    table.insert(tab_item_table.navi, {
        text = self.goto_menu_title,
        callback = function()
            self:onShowGotoDialog()
        end,
    })
    table.insert(tab_item_table.navi, {
        text = self.skim_menu_title,
        callback = function()
            self:onShowSkimtoDialog()
        end,
    })
end

function ReaderGoto:onShowGotoDialog()
    local dialog_title, goto_btn, curr_page
    if self.document.info.has_pages then
        dialog_title = _("Go to Page")
        goto_btn = {
            is_enter_default = true,
            text = _("Page"),
            callback = function() self:gotoPage() end,
        }
        curr_page = self.ui.paging.current_page
    else
        dialog_title = _("Go to Location")
        goto_btn = {
            is_enter_default = true,
            text = _("Location"),
            callback = function() self:gotoPage() end,
        }
        -- only CreDocument has this method
        curr_page = self.document:getCurrentPage()
    end
    self.goto_dialog = InputDialog:new{
        title = dialog_title,
        input_hint = "@"..curr_page.." (1 - "..self.document:getPageCount()..")",
        buttons = {
            {
                {
                    text = _("Cancel"),
                    enabled = true,
                    callback = function()
                        self:close()
                    end,
                },
                goto_btn,
                {
                    text = _("Skim mode"),
                    enabled = true,
                    callback = function()
                        self:close()
                        self.skimto = SkimToWidget:new{
                            document = self.document,
                            ui = self.ui,
                            callback_switch_to_goto = function()
                                UIManager:close(self.skimto)
                                self:onShowGotoDialog()
                            end,
                        }
                        UIManager:show(self.skimto)

                    end,
                },
            },
        },
        input_type = "number",
    }
    self.goto_dialog:onShowKeyboard()
    UIManager:show(self.goto_dialog)
end

function ReaderGoto:onShowSkimtoDialog()
    self.skimto = SkimToWidget:new{
        document = self.document,
        ui = self.ui,
        callback_switch_to_goto = function()
            UIManager:close(self.skimto)
            self:onShowGotoDialog()
        end,
    }
    UIManager:show(self.skimto)
end

function ReaderGoto:close()
    UIManager:close(self.goto_dialog)
end

function ReaderGoto:gotoPage()
    local page_number = self.goto_dialog:getInputText()
    local relative_sign = page_number:sub(1, 1)
    local number = tonumber(page_number)
    if number then
        if relative_sign == "+" or relative_sign == "-" then
            self.ui:handleEvent(Event:new("GotoRelativePage", number))
        else
            self.ui:handleEvent(Event:new("GotoPage", number))
        end
        self:close()
    end
end

return ReaderGoto
