FurnitureCatalogue                = {}
FurnitureCatalogue.name           = "FurnitureCatalogue"
FurnitureCatalogue.author         = "manavortex"
FurnitureCatalogue.version        = 3.5
FurnitureCatalogue.CharacterName  = nil
FurnitureCatalogue.settings       = {}

FurC                               = FurnitureCatalogue

FurC.AchievementVendors           = {}
FurC.LuxuryFurnisher              = {}
FurC.Recipes                      = {}
FurC.Rolis                        = {}
FurC.Faustina                     = {}
FurC.RolisRecipes                 = {}
FurC.FaustinaRecipes              = {}
FurC.Books                        = {}
FurC.EventItems                   = {}
FurC.PVP                          = {}
FurC.MiscItemSources              = {}
FurC.RumourRecipes                = {}





-- TODO: set up the filtering for FURC_RUMOUR and FURC_CROWN in submenus by origin
local defaults             = {

  hideMats              = true,
  dontScanTradingHouse  = false,
  enableDebug           = false,

  data                 = {},
  filterCraftingType   = {},
  filterQuality        = {},

  resetDropdownChoice  = false,
  useTinyUi            = false,
  useInventoryIcons    = true,
  fontSize             = 18,

  gui                 = {
    lastX             = 100,
    lastY             = 100,
    width             = 650,
    height            = 550,
  },

  dropdownDefaults    = {
    Source            = 1,
    Character         = 1,
    Version           = 1,
  },

  accountCharacters    = {},

  -- tooltips
  disableTooltips      = false,
  coloredTooltips      = true,
  hideKnowledge        = false,

  hideBooks            = true,
  hideDoubtfuls        = true,
  hideCrownstore       = true,
  hideRumourEntry      = false,
  hideCrownStoreEntry  = false,
  wipeDatabase         = false,
  startupSilently      = true,

  hideUiButtons = {
      FURC_RUMOUR = false,
      FURC_CROWN  = false,
  }

}


local sourceIndicesKeys = {}
local function getSourceIndicesKeys()
  sourceIndicesKeys[FURC_NONE]                = "off"
  sourceIndicesKeys[FURC_FAVE]                = "favorites"
  sourceIndicesKeys[FURC_CRAFTING]            = "craft_all"
  sourceIndicesKeys[FURC_CRAFTING_KNOWN]      = "craft_known"
  sourceIndicesKeys[FURC_CRAFTING_UNKNOWN]    = "craft_unknown"
  sourceIndicesKeys[FURC_VENDOR]              = "purch_gold"
  sourceIndicesKeys[FURC_PVP]                 = "purch_ap"
  sourceIndicesKeys[FURC_CROWN]               = "crownstore"
  sourceIndicesKeys[FURC_RUMOUR]              = "rumour"
  sourceIndicesKeys[FURC_LUXURY]              = "luxury"
  sourceIndicesKeys[FURC_OTHER]               = "other"
  sourceIndicesKeys[FURC_WRIT_VENDOR]         = "writ_vendor"
  return sourceIndicesKeys
end
FurC.GetSourceIndicesKeys = getSourceIndicesKeys

local choicesSource = {}
local function getChoicesSource()
  choicesSource[FURC_NONE]            = GetString(SI_FURC_NONE)
  choicesSource[FURC_FAVE]             = GetString(SI_FURC_FAVE)
  choicesSource[FURC_CRAFTING]           = GetString(SI_FURC_CRAFTING)
  choicesSource[FURC_CRAFTING_KNOWN]         = GetString(SI_FURC_CRAFTING_KNOWN)
  choicesSource[FURC_CRAFTING_UNKNOWN]       = GetString(SI_FURC_CRAFTING_UNKNOWN)
  choicesSource[FURC_VENDOR]             = GetString(SI_FURC_VENDOR)
  choicesSource[FURC_PVP]             = GetString(SI_FURC_PVP)
  choicesSource[FURC_WRIT_VENDOR]         = GetString(SI_FURC_STRING_WRIT_VENDOR)
  choicesSource[FURC_CROWN]               = GetString(SI_FURC_CROWN)
  choicesSource[FURC_RUMOUR]               = GetString(SI_FURC_RUMOUR)
  choicesSource[FURC_LUXURY]               = GetString(SI_FURC_LUXURY)
  choicesSource[FURC_OTHER]                 = GetString(SI_FURC_OTHER)

  return choicesSource
end
FurC.GetChoicesSource = getChoicesSource

local tooltipsSource = {}
local function getTooltipsSource()
  tooltipsSource[FURC_NONE]             = GetString(SI_FURC_NONE_TT)
  tooltipsSource[FURC_FAVE]             = GetString(SI_FURC_FAVE_TT)
  tooltipsSource[FURC_CRAFTING]         = GetString(SI_FURC_CRAFTING_TT)
  tooltipsSource[FURC_CRAFTING_KNOWN]   = GetString(SI_FURC_CRAFTING_KNOWN_TT)
  tooltipsSource[FURC_CRAFTING_UNKNOWN] = GetString(SI_FURC_CRAFTING_UNKNOWN_TT)
  tooltipsSource[FURC_VENDOR]           = GetString(SI_FURC_VENDOR_TT)
  tooltipsSource[FURC_PVP]              = GetString(SI_FURC_PVP_TT)
  tooltipsSource[FURC_CROWN]            = GetString(SI_FURC_CROWN_TT)
  tooltipsSource[FURC_WRIT_VENDOR]      = GetString(SI_FURC_STRING_WRIT_VENDOR_TT)
  tooltipsSource[FURC_RUMOUR]           = GetString(SI_FURC_RUMOUR_TT)
  tooltipsSource[FURC_LUXURY]           = GetString(SI_FURC_LUXURY_TT)
  tooltipsSource[FURC_OTHER]            = GetString(SI_FURC_OTHER_TT)

  return tooltipsSource
end
FurC.GetTooltipsSource = getTooltipsSource

FurnitureCatalogue.DropdownData = {
  ChoicesVersion  = {
    [1] = GetString(SI_FURC_FILTER_VERSION_OFF),
    [2] = GetString(SI_FURC_FILTER_VERSION_HS  ),
    [3] = GetString(SI_FURC_FILTER_VERSION_M  ),
    [4] = GetString(SI_FURC_FILTER_VERSION_R  ),
    [5] = GetString(SI_FURC_FILTER_VERSION_CC  ),
    [6] = GetString(SI_FURC_FILTER_VERSION_DRAGON),
    [7] = GetString(SI_FURC_FILTER_VERSION_ALTMER),
    [8] = GetString(SI_FURC_FILTER_VERSION_SLAVES),
    [9] = GetString(SI_FURC_FILTER_VERSION_WEREWOLF),
    [10] = GetString(SI_FURC_FILTER_VERSION_WOTL),
    [11] = GetString(SI_FURC_FILTER_VERSION_KITTY),
  },
  TooltipsVersion  = {
    [1] =  GetString(SI_FURC_FILTER_VERSION_OFF_TT),
    [2] =  GetString(SI_FURC_FILTER_VERSION_HS_TT),
    [3] =  GetString(SI_FURC_FILTER_VERSION_M_TT),
    [4] =  GetString(SI_FURC_FILTER_VERSION_R_TT),
    [5] =  GetString(SI_FURC_FILTER_VERSION_CC_TT),
    [6] =  GetString(SI_FURC_FILTER_VERSION_DRAGON_TT),
    [7] = GetString(SI_FURC_FILTER_VERSION_ALTMER_TT),
    [8] = GetString(SI_FURC_FILTER_VERSION_SLAVES_TT),
    [9] = GetString(SI_FURC_FILTER_VERSION_WEREWOLF_TT),
    [10] = GetString(SI_FURC_FILTER_VERSION_WOTL_TT),
    [11] = GetString(SI_FURC_FILTER_VERSION_KITTY_TT),
  },
  ChoicesCharacter  = {
    [1]  = GetString(SI_FURC_FILTER_CHAR_OFF),
  },
  TooltipsCharacter = {
    [1]  = GetString(SI_FURC_FILTER_CHAR_OFF_TT),
  },

  -- will be set in setupSourceDropdown
  ChoicesSource  = {},
  TooltipsSource   = {},
}


function FurC.UpdateDropdowns()
  FurC.DropdownData.ChoicesSource  = FurC.GetChoicesSource()
  FurC.DropdownData.TooltipsSource = FurC.GetTooltipsSource()
end

local function setupSourceDropdown()
  FurC.UpdateDropdowns()
  sourceIndices = {}

  for idx, key in ipairs(getSourceIndicesKeys()) do
    sourceIndices[key] = idx
  end
  FurC.SourceIndices = sourceIndices
end

local logger = (LibDebugLogger and LibDebugLogger("MyAddon")) or nil
function FurC.DebugOut(...)
  if logger then
    logger:Debug(...)
  elseif FurC.settings.enableDebug then
    zo_strformat(...)
  end
end
local p = FurC.DebugOut

function whoami()
  return FurnitureCatalogue.CharacterName
end


-- initialization stuff
function FurnitureCatalogue_Initialize(eventCode, addOnName)
  if (addOnName ~= FurnitureCatalogue.name) then return end

  FurnitureCatalogue.settings   = ZO_SavedVars:NewAccountWide("FurnitureCatalogue_Settings", 2, nil, defaults)

  -- setup the "source" dropdown for the menu
  setupSourceDropdown()

  FurnitureCatalogue.CreateSettings(FurnitureCatalogue.settings, defaults, FurnitureCatalogue)

  FurnitureCatalogue.CharacterName = zo_strformat(GetUnitName('player'))

  FurC.RegisterEvents()

  FurC.InitGui()

  FurnitureCatalogue.CreateTooltips()
  FurC.InitRightclickMenu()

  FurC.SetupInventoryRecipeIcons()

  local scanFiles = false
  if FurC.settings.version     < FurC.version then
      FurC.settings.version     = FurC.version
    scanFiles = true
  end

  FurnitureCatalogue.ScanRecipes(scanFiles, not FurC.GetSkipInitialScan())
  FurC.settings.databaseVersion   = FurC.version
  SLASH_COMMANDS["/fur"]          = FurnitureCatalogue_Toggle

  FurC.SetFilter(true)

  EVENT_MANAGER:UnregisterForEvent("FurnitureCatalogue", EVENT_ADD_ON_LOADED)

end

ZO_CreateStringId("SI_BINDING_NAME_TOGGLE_FURNITURE_CATALOGUE", "Toggle Furniture Catalogue")
EVENT_MANAGER:RegisterForEvent("FurnitureCatalogue", EVENT_ADD_ON_LOADED, FurnitureCatalogue_Initialize)