local Classes = MyCollection.Internals.Classes
local Constants = MyCollection.Internals.Constants
local Functions = MyCollection.Internals.Functions
local Data = MyCollection.Internals.Data
local Saved = MyCollection.Internals.Saved
local Defaults = MyCollection.Internals.Saved.Defaults
local Dependencies = MyCollection.Internals.Dependencies
local EventManager = MyCollection.Internals.Dependencies.Officials.EventManager
local SharedInventory = MyCollection.Internals.Dependencies.Officials.SharedInventory
local Logger = MyCollection.Internals.Dependencies.Logger
local UI = MyCollection.UI

-- Functions
function MyCollection.ResetInventory(event)
  Data.Inventory:Refresh()
end

-- Initialite
function MyCollection:Initialize()
  -- Saved variable load
  Saved.Inventory = Dependencies.LibSavedVars:NewAccountWide(MyCollection.Internals.SavedVariables.Inventory.Name, nil, Defaults.Inventory ):Version(MyCollection.Internals.SavedVariables.Inventory.Version, function(table) end)
  Saved.Collection = Dependencies.LibSavedVars:NewAccountWide(MyCollection.Internals.SavedVariables.Collection.Name, nil, Defaults.Collection ):Version(MyCollection.Internals.SavedVariables.Collection.Version, function(table) end)
  Saved.Settings = Dependencies.LibSavedVars:NewAccountWide(MyCollection.Internals.SavedVariables.Settings.Name, nil, Defaults.Settings ):Version(MyCollection.Internals.SavedVariables.Settings.Version, function(table) end)

  Saved.Settings.Logging = false
  Logger:SetEnabled(Saved.Settings.Logging)

  Data.Inventory = Classes.Inventory.New(Saved.Inventory)
  Data.Collection = Classes.Collection.New(Saved.Collection)

  -- Register Callbacks
  --SharedInventory:RegisterCallback("SingleSlotInventoryUpdate", MyCollection.Internals.Functions.Callbacks.WUT)
  SharedInventory:RegisterCallback("SlotRemoved", Functions.Callbacks.Removed)
  SharedInventory:RegisterCallback("SlotAdded", Functions.Callbacks.Added)
  SharedInventory:RegisterCallback("SlotUpdated", Functions.Callbacks.Updated)

  -- Refresh the current caracters and banks data
  Data.Inventory:Refresh()

  --  Initialize UI
  UI.Frame.Initialize()
end

function MyCollection.OnAddOnLoaded(event, addonName)
  if MyCollection.Name ~= addonName then return end

  while not LibSets.AreSetsLoaded() do end

  EventManager:UnregisterForEvent(MyCollection.Name, EVENT_ADD_ON_LOADED)
  MyCollection:Initialize()
end

EventManager:RegisterForEvent(MyCollection.Name, EVENT_ADD_ON_LOADED, MyCollection.OnAddOnLoaded)

---- Possible usefull events
-- Logout
--EVENT_PLAYER_DEACTIVATED

-- Change inventory item
--EVENT_INVENTORY_SINGLE_SLOT_UPDATE
---- EVENT_INVENTORY_SINGLE_SLOT_UPDATE, REGISTER_FILTER_INVENTORY_UPDATE_REASON, INVENTORY_UPDATE_REASON_DEFAULT

-- Open Bank
--EVENT_OPEN_BANK

-- Open Guild Bank, add/remove item
--EVENT_GUILD_BANK_ITEMS_READY
--EVENT_GUILD_BANK_ITEM_ADDED
--EVENT_GUILD_BANK_ITEM_REMOVED
--EVENT_GUILD_SELF_JOINED_GUILD
--EVENT_GUILD_SELF_LEFT_GUILD

-- Entered House
--EVENT_PLAYER_ACTIVATED
--EVENT_HOUSING_EDITOR_MODE_CHANGEDw