local Device = require("device")
local Screensaver = require("ui/screensaver")
local lfs = require("libs/libkoreader-lfs")
local _ = require("gettext")
local T = require("ffi/util").template

local is_touch_device = Device:isTouchDevice() or nil
local ui = require("apps/reader/readerui").instance or require("apps/filemanager/filemanager").instance

local function hasLastFile()
    local last_file = G_reader_settings:readSetting("lastfile")
    return last_file and lfs.attributes(last_file, "mode") == "file"
end

local function isReaderProgressEnabled()
    return ui.statistics ~= nil
end

local function allowRandomImageFolder()
    local may_ignore_book_cover = G_reader_settings:isTrue("screensaver_exclude_on_hold_books")
        or G_reader_settings:isTrue("screensaver_exclude_finished_books")
        or G_reader_settings:isTrue("screensaver_hide_cover_in_filemanager")
        or Screensaver.isExcluded(ui)
    return G_reader_settings:readSetting("screensaver_type") == "random_image"
            or (G_reader_settings:readSetting("screensaver_type") == "cover" and may_ignore_book_cover)
end

local function genMenuItem(text, setting, value, enabled_func, separator, help_text)
    return {
        text = text,
        help_text = help_text,
        enabled_func = enabled_func,
        checked_func = function()
            return G_reader_settings:readSetting(setting) == value
        end,
        callback = function()
            G_reader_settings:saveSetting(setting, value)
        end,
        radio = true,
        separator = separator,
    }
end

local exit_help_text = _("The 'Exit sleep screen' action is located in the Device group of the Taps and gestures settings")

return {
    {
        text = _("Wallpaper"),
        sub_item_table = {
            genMenuItem(_("Show book cover on sleep screen"), "screensaver_type", "cover", hasLastFile),
            genMenuItem(_("Show custom image or cover on sleep screen"), "screensaver_type", "document_cover"),
            genMenuItem(_("Show random image from folder on sleep screen"), "screensaver_type", "random_image"),
            genMenuItem(_("Show reading progress on sleep screen"), "screensaver_type", "readingprogress", isReaderProgressEnabled),
            genMenuItem(_("Show book status on sleep screen"), "screensaver_type", "bookstatus", hasLastFile),
            genMenuItem(_("Leave screen as-is"), "screensaver_type", "disable", nil, true),
            -- separator
            {
                text = _("Ignore book cover"),
                help_text = _("Choose when to ignore showing book covers on the sleep screen."),
                enabled_func = function()
                    return G_reader_settings:readSetting("screensaver_type") == "cover"
                end,
                checked_func = function()
                    return G_reader_settings:isTrue("screensaver_hide_cover_in_filemanager")
                            or G_reader_settings:isTrue("screensaver_exclude_finished_books")
                            or G_reader_settings:isTrue("screensaver_exclude_on_hold_books")
                end,
                sub_item_table = {
                    {
                        text = _("For books on hold"),
                        help_text = _("When the device is locked and the current book has been marked as on hold, both the cover and sleep screen message of the book will not be shown."),
                        checked_func = function()
                            return G_reader_settings:isTrue("screensaver_exclude_on_hold_books")
                        end,
                        callback = function()
                            G_reader_settings:flipNilOrFalse("screensaver_exclude_on_hold_books")
                        end,
                    },
                    {
                        text = _("For finished books"),
                        help_text = _("When the device is locked and the current book has been marked as finished, both the cover and sleep screen message of the book will not be shown."),
                        checked_func = function()
                            return G_reader_settings:isTrue("screensaver_exclude_finished_books")
                        end,
                        callback = function()
                            G_reader_settings:flipNilOrFalse("screensaver_exclude_finished_books")
                        end,
                    },
                    {
                        text = _("When in file browser"),
                        help_text = _("When the device is locked from the file browser, both the cover and sleep screen message of the last opened book will not be shown."),
                        checked_func = function()
                            return G_reader_settings:isTrue("screensaver_hide_cover_in_filemanager")
                        end,
                        callback = function()
                            G_reader_settings:flipNilOrFalse("screensaver_hide_cover_in_filemanager")
                        end,
                    },
                },
                separator = true,
            },
            {
                text = _("Border fill, rotation, and fit"),
                enabled_func = function()
                    return G_reader_settings:readSetting("screensaver_type") == "cover"
                           or G_reader_settings:readSetting("screensaver_type") == "document_cover"
                           or G_reader_settings:readSetting("screensaver_type") == "random_image"
                end,
                sub_item_table = {
                    genMenuItem(_("Black fill"), "screensaver_img_background", "black"),
                    genMenuItem(_("White fill"), "screensaver_img_background", "white"),
                    genMenuItem(_("No fill"), "screensaver_img_background", "none", nil, true),
                    -- separator
                    {
                        text_func = function()
                            local percentage = G_reader_settings:readSetting("screensaver_stretch_limit_percentage")
                            if G_reader_settings:isTrue("screensaver_stretch_images") and percentage then
                                return T(_("Stretch to fit screen (with limit: %1 %)"), percentage)
                            end
                            return _("Stretch cover to fit screen")
                        end,
                        checked_func = function()
                            return G_reader_settings:isTrue("screensaver_stretch_images")
                        end,
                        callback = function(touchmenu_instance)
                            Screensaver:setStretchLimit(touchmenu_instance)
                        end,
                    },
                    {
                        text = _("Rotate cover for best fit"),
                        checked_func = function()
                            return G_reader_settings:isTrue("screensaver_rotate_auto_for_best_fit")
                        end,
                        callback = function(touchmenu_instance)
                            G_reader_settings:flipNilOrFalse("screensaver_rotate_auto_for_best_fit")
                            touchmenu_instance:updateItems()
                        end,
                    }
                },
            },
            {
                text = _("Postpone screen update after wake-up"),
                sub_item_table = {
                    genMenuItem(_("Never"), "screensaver_delay", "disable"),
                    genMenuItem(_("1 second"), "screensaver_delay", "1"),
                    genMenuItem(_("3 seconds"), "screensaver_delay", "3"),
                    genMenuItem(_("5 seconds"), "screensaver_delay", "5"),
                    genMenuItem(is_touch_device and _("Until a tap") or _("Until a key press"), "screensaver_delay", "tap"),
                    is_touch_device and genMenuItem(_("Until 'Exit sleep screen' gesture"), "screensaver_delay", "gesture",
                        nil, true, exit_help_text),
                    is_touch_device and {
                        text = _("Show 'Exit sleep screen' message"),
                        enabled_func = function()
                            return G_reader_settings:readSetting("screensaver_delay") == "gesture"
                        end,
                        checked_func = function()
                            return G_reader_settings:hasNot("screensaver_show_exit_message") -- save 'false' only
                        end,
                        callback = function()
                            G_reader_settings:flipFalse("screensaver_show_exit_message")
                        end,
                    },
                    is_touch_device and {
                        text = _("Edit 'Exit sleep screen' message"),
                        enabled_func = function()
                            return G_reader_settings:readSetting("screensaver_delay") == "gesture"
                                and G_reader_settings:hasNot("screensaver_show_exit_message")
                        end,
                        keep_menu_open = true,
                        callback = function()
                            Screensaver:setMessage(true)
                        end,
                    },
                },
            },
            {
                text = _("Custom images"),
                enabled_func = function()
                    return allowRandomImageFolder() or G_reader_settings:readSetting("screensaver_type") == "document_cover"
                end,
                sub_item_table = {
                    {
                        text = _("Choose image or document cover"),
                        enabled_func = function()
                            return G_reader_settings:readSetting("screensaver_type") == "document_cover"
                        end,
                        keep_menu_open = true,
                        callback = Screensaver.chooseFile,
                    },
                    {
                        text = _("Choose random image folder"),
                        enabled_func = allowRandomImageFolder,
                        keep_menu_open = true,
                        callback = Screensaver.chooseFolder,
                        separator = true,
                    },
                    {
                        text = _("Cycle through images in order"),
                        help_text = _("When enabled, all images (up to 256) will be displayed at least once on the sleep screen in sequence before repeating the cycle."),
                        enabled_func = allowRandomImageFolder,
                        checked_func = function()
                            return G_reader_settings:isTrue("screensaver_cycle_images_alphabetically")
                        end,
                        callback = function()
                            G_reader_settings:flipNilOrFalse("screensaver_cycle_images_alphabetically")
                        end,
                    },
                },
            },
        },
    },
    {
        text = _("Sleep screen message"),
        sub_item_table = {
            {
                text = _("Add custom message to sleep screen"),
                checked_func = function()
                    return G_reader_settings:isTrue("screensaver_show_message")
                end,
                callback = function()
                    G_reader_settings:toggle("screensaver_show_message")
                end,
                separator = true,
            },
            {
                text = _("Edit sleep screen message"),
                enabled_func = function()
                    return G_reader_settings:isTrue("screensaver_show_message")
                end,
                keep_menu_open = true,
                callback = function()
                    Screensaver:setMessage()
                end,
            },
            {
                text = _("Container and position"),
                enabled_func = function()
                    return G_reader_settings:isTrue("screensaver_show_message")
                end,
                sub_item_table = {
                    genMenuItem(_("Banner"), "screensaver_message_container", "banner"),
                    genMenuItem(_("Box"), "screensaver_message_container", "box", nil, true),
                    {
                        text_func = function()
                            local percent = G_reader_settings:readSetting("screensaver_message_vertical_position")
                            local value
                            if percent == 100 then
                                value = _("top")
                            elseif percent == 50 then
                                value = _("middle")
                            elseif percent == 0 then
                                value = _("bottom")
                            else
                                value = percent .. "\xE2\x80\xAF%" -- narrow no-break space
                            end
                            return T(_("Vertical position: %1"), value)
                        end,
                        help_text = _("Set a custom vertical position for the sleep screen message."),
                        keep_menu_open = true,
                        callback = function(touchmenu_instance)
                            Screensaver:setCustomPosition(touchmenu_instance)
                        end,
                    },
                    {
                        text_func = function()
                            local alpha = G_reader_settings:readSetting("screensaver_message_alpha", 100)
                            return T(_("Message opacity: %1"), alpha) .. "\xE2\x80\xAF%"
                        end,
                        help_text = _("Set the opacity level of the sleep screen message."),
                        keep_menu_open = true,
                        callback = function(touchmenu_instance)
                            Screensaver:setMessageOpacity(touchmenu_instance)
                        end,
                    },
                },
            },
            {
                text = _("Background fill"),
                help_text = _("This option will only become available, if you have selected 'Leave screen as-is' as wallpaper and have 'Sleep screen message' on."),
                enabled_func = function()
                    return G_reader_settings:readSetting("screensaver_type") == "disable" and G_reader_settings:isTrue("screensaver_show_message")
                end,
                sub_item_table = {
                    genMenuItem(_("Black fill"), "screensaver_msg_background", "black"),
                    genMenuItem(_("White fill"), "screensaver_msg_background", "white"),
                    genMenuItem(_("No fill"), "screensaver_msg_background", "none"),
                },
            },
            (Device:canReboot() and Device:canPowerOff()) and {
                text = _("Hide reboot/poweroff message"),
                checked_func = function()
                    return G_reader_settings:isTrue("screensaver_hide_fallback_msg")
                end,
                callback = function()
                    G_reader_settings:toggle("screensaver_hide_fallback_msg")
                end,
            } or nil,
        },
    },
}
