--[[--
This module contains miscellaneous helper functions for the creoptions and koptoptions.
]]

local Device = require("device")
local InfoMessage = require("ui/widget/infomessage")
local UIManager = require("ui/uimanager")
local _ = require("gettext")
local Screen = Device.screen
local T = require("ffi/util").template

local optionsutil = {}

function optionsutil.enableIfEquals(configurable, option, value)
    return configurable[option] == value
end

function optionsutil.showValues(configurable, option, prefix)
    local default = G_reader_settings:readSetting(prefix.."_"..option.name)
    local current = configurable[option.name]
    local value_default, value_current
    local suffix = option.name_text_suffix or ""
    if option.name == "screen_mode" then
        current = Screen:getScreenMode()
    end
    local arg_table = {}
    if option.toggle and option.values then
        for i=1,#option.toggle do
            arg_table[option.values[i]] = option.toggle[i]
        end
    end
    if not default then
        default = "not set"
        if option.toggle and option.values then
            value_current = current
            current = arg_table[current]
        end
    elseif option.toggle and option.values then
        value_current = current
        value_default = default
        default = arg_table[default]
        current = arg_table[current]
    end
    if option.labels and option.values then
        for i=1,#option.labels do
            if default == option.values[i] then
                default = option.labels[i]
                break
            end
        end
        for i=1,#option.labels do
            if current == option.values[i] then
                current = option.labels[i]
                break
            end
        end
    end
    local help_text = ""
    if option.help_text then
        help_text = T("\n%1\n", option.help_text)
    end
    local text
    if option.name_text_true_values and option.toggle and option.values and value_default then
        text = T(_("%1:\n%2\nCurrent value: %3 (%6%5)\nDefault value: %4 (%7%5)"), option.name_text, help_text,
            current, default, suffix, value_current, value_default)
    elseif option.name_text_true_values and option.toggle and option.values and not value_default then
        text = T(_("%1\n%2\nCurrent value: %3 (%6%5)\nDefault value: %4"), option.name_text, help_text,
            current, default, suffix, value_current)
    else
        text = T(_("%1\n%2\nCurrent value: %3%5\nDefault value: %4%5"), option.name_text, help_text,
            current, default, suffix)
    end
    UIManager:show(InfoMessage:new{ text=text })
end

local function tableComp(a,b)
    if #a ~= #b then return false end
    for i=1,#a do
        if a[i] ~= b[i] then return false end
    end
    return true
end

function optionsutil.showValuesMargins(configurable, option)
    local default = G_reader_settings:readSetting("copt_"..option.name)
    local current = configurable[option.name]
    local current_string
    for i=1,#option.toggle do
        if tableComp(current, option.values[i]) then
            current_string = option.toggle[i]
            break
        end
    end
    if not default then
        UIManager:show(InfoMessage:new{
            text = T(_([[
%1:
Current value: %2
  left: %3
  top: %4
  right: %5
  bottom: %6
Default value: not set]]),
                option.name_text, current_string, current[1], current[2], current[3], current[4])
        })
    else
        local default_string
        for i=1,#option.toggle do
            if tableComp(default, option.values[i]) then
                default_string = option.toggle[i]
                break
            end
        end
        UIManager:show(InfoMessage:new{
            text = T(_([[
%1:
Current value: %2
  left: %3
  top: %4
  right: %5
  bottom: %6
Default value: %7
  left: %8
  top: %9
  right: %10
  bottom: %11]]),
                option.name_text, current_string, current[1], current[2], current[3], current[4],
                default_string, default[1], default[2], default[3], default[4])
        })
    end
end

return optionsutil
