LibrarianSettings = ZO_Object:Subclass()

local timeFormats = {
	{ name = "12 hour", value = TIME_FORMAT_PRECISION_TWELVE_HOUR },
	{ name = "24 hour", value = TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR }
}

local alertStyles = {
	{ name = "None", value = "None", chat = false, alert = false },
	{ name = "Chat only", value = "Chat", chat = true, alert = false },
	{ name = "Alert only", value = "Alert", chat = false, alert = true },
	{ name = "Both", value = "Both", chat = true, alert = true },
}

local reloadReminders = {
	{ name = "Never", value = 0 },
	{ name = "1 new book", value = 1 },
	{ name = "5 new books", value = 5 },
	{ name = "10 new books", value = 10 }
}

function LibrarianSettings:New( ... )
    local result = ZO_Object.New( self )
    result:Initialise( ... )
    return result
end

local function map(tbl, f)
    local t = {}
    for k,v in pairs(tbl) do
        t[k] = f(v)
    end
    return t
end

local function getSettingByName(tbl, name)
	for _,p in pairs(tbl) do
		if p.name == name then return p end
	end
end

local function getSettingByValue(tbl, value)
	for _,p in pairs(tbl) do
		if p.value == value then return p end
	end
end

function LibrarianSettings:Initialise(settings)
	self.settings = settings

	if self.settings.timeFormat == nil then
		self.settings.timeFormat = (GetCVar("Language.2") == "en") and TIME_FORMAT_PRECISION_TWELVE_HOUR or TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR
	end

	if self.settings.showAllBooks == nil then
		self.settings.showAllBooks = true
	end

	if self.settings.alertStyle == nil then
		self.settings.alertStyle = 'Both'
		self.settings.chatEnabled = true
		self.settings.alertEnabled = true
	end

	if self.settings.showUnreadIndicatorInReader == nil then
		self.settings.showUnreadIndicatorInReader = true
	end

	if self.settings.reloadReminderBookCount == nil then
		self.settings.reloadReminderBookCount = 5
	end

  if self.settings.enableCharacterSpin == nil then
    self.settings.enableCharacterSpin = true
  end

  local panelData = {
    type = "panel",
    name = "Librarian",
    displayName = "Librarian Book Manager",
    author = "|c4EFFF6Calia1120|r, Flamage",
    version = "1.6.2",
    slashCommand = "/librarianOptions"
  }

  local optionsTable = {
    [1] = {
      type = "dropdown",
      name = "Time Format",
      tooltip = "Select a format to display times in.",
      choices = map(timeFormats, function(item) return item.name end),
      getFunc = function() return getSettingByValue(timeFormats, self.settings.timeFormat).name end,
      setFunc = function(name)
        self.settings.timeFormat = getSettingByName(timeFormats, name).value
        LIBRARIAN:CommitScrollList()
      end
    },
    [2] = {
      type = "dropdown",
      name = "Alert Settings",
      tooltip = "Select a style of alert.",
      choices = map(alertStyles, function(item) return item.name end),
      getFunc = function() return getSettingByValue(alertStyles, self.settings.alertStyle).name end,
      setFunc = function(name)
        local setting = getSettingByName(alertStyles, name)
        self.settings.alertStyle = setting.value
        self.settings.chatEnabled = setting.chat
        self.settings.alertEnabled = setting.alert
      end
    },
    [3] = {
      type = "dropdown",
      name = "ReloadUI reminder after",
      tooltip = "Reminder to /reloadui after this number of new books are discovered.",
      choices = map(reloadReminders, function(item) return item.name end),
      getFunc = function() return getSettingByValue(reloadReminders, self.settings.reloadReminderBookCount).name end,
      setFunc = function(name)
        local setting = getSettingByName(reloadReminders, name)
        self.settings.reloadReminderBookCount = setting.value
      end
    },
    [4] = {
      type = "checkbox",
      name = "Unread Indicator",
      tooltip = "Show an unread indicator in book reader.",
      getFunc = function() return self.settings.showUnreadIndicatorInReader end,
      setFunc = function(value) self.settings.showUnreadIndicatorInReader = value end
    },
    [5] = {
      type = "checkbox",
      name = "Character Spin",
      tooltip = "Allow the character to spin and face the camera when Librarian is open.",
      getFunc = function() return self.settings.enableCharacterSpin end,
      setFunc = function(value)
        self.settings.enableCharacterSpin = value
        SLASH_COMMANDS["/reloadui"]()
      end,
      warning = "UI will be reloaded automatically."
    },
    [6] = {
      type = "button",
      name = "Import from Lore Library",
      tooltip = "Import any missing books from the Lore Library.  Works with all books once Eidetic Memory is unlocked.",
      func = function() LIBRARIAN:ImportFromLoreLibrary() end
    }
  }

  if Librarian_SavedVariables["Default"][""] ~= nil then
    optionsTable[6] = {
      type = "button",
      name = "Import from before patch",
      tooltip = "Migrate data from before Patch 1.3, where account name was broken.",
      func = function() LIBRARIAN:ImportFromEmptyAccount() end
    }
  end

  local LAM = LibStub("LibAddonMenu-2.0")
  LAM:RegisterAddonPanel("LibrarianOptions", panelData)
  LAM:RegisterOptionControls("LibrarianOptions", optionsTable)
end