local Saved = MyCollection.Internals.Saved
local Constants = MyCollection.Internals.Constants
local Dependencies = MyCollection.Internals.Dependencies
local Logger = MyCollection.Internals.Dependencies.Logger
local EventManager = MyCollection.Internals.Dependencies.Officials.EventManager
local SceneManager = MyCollection.Internals.Dependencies.Officials.SceneManager
local SlashCommands = MyCollection.Internals.Dependencies.Officials.SlashCommands
local UI = MyCollection.UI
local Controls = MyCollection.UI.Controls

UI.Frame = {}
UI.Frame.__index = UI.Frame

local Frame = UI.Frame

-- UI containers
Frame.Element = nil

-- Sub Elements
Frame.MenuBar = nil
Frame.Grid = nil
Frame.AddSet = nil

-- Properties
Frame.initialized = false
Frame.scene = nil
Frame.sceneName = nil

Frame.modes = {
    grid = 1,
    new = 2,
}

-- Functions
function Frame.ShowSettings()
    Frame.ToggleOpenClose()
	--Dependencies.LibAddonMenu:OpenToPanel(addOnPanel)
end

function Frame.ToggleOpenClose()
    Dependencies.LibMainMenu:Refresh()
    Dependencies.LibMainMenu:SelectMenuItem(MyCollection.Name)
end

function Frame.OnReposition()
    Saved.Settings.Window.Position.Left = Frame.Element:GetLeft()
    Saved.Settings.Window.Position.Top = Frame.Element:GetTop()
end

function Frame.SetPosition()
    local left = Saved.Settings.Window.Position.Left
    local top = Saved.Settings.Window.Position.Top

    Frame.Element:ClearAnchors()
    Frame.Element:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, left, top)
end

function Frame:RefreshUI()
    if (not self.initialized) then return end

    Frame.Grid:RefreshData()
end

function Frame.Initialize()
    if Frame.initialized then return end

    Frame.initialized = true
    Frame.Element = MyCollectionUIFrame
    Frame.sceneName = MyCollection.Name .. "Scene"

    Frame.scene = ZO_Scene:New(Frame.sceneName, SceneManager)
	Frame.scene:AddFragment(ZO_SetTitleFragment:New(MYCOLLECTION_TITLE))
	Frame.scene:AddFragment(ZO_FadeSceneFragment:New(Frame.Element))
	Frame.scene:AddFragment(TITLE_FRAGMENT)
	Frame.scene:AddFragment(RIGHT_BG_FRAGMENT)
	Frame.scene:AddFragment(FRAME_EMOTE_FRAGMENT_MAP)
	Frame.scene:AddFragment(CODEX_WINDOW_SOUNDS)
    Frame.scene:AddFragment(PLAYER_PROGRESS_BAR_FRAGMENT)
	Frame.scene:AddFragmentGroup(FRAGMENT_GROUP.MOUSE_DRIVEN_UI_WINDOW)
    --Frame.scene:AddFragmentGroup(FRAGMENT_GROUP.FRAME_TARGET_CENTERED)
    Frame.scene:AddFragmentGroup(FRAGMENT_GROUP.PLAYER_PROGRESS_BAR_KEYBOARD_CURRENT)

    Frame.Grid = Controls.Grid:New(Frame.Element:GetNamedChild("Grid"))
    Frame.AddSet = Controls.AddSet.New(Frame.Element:GetNamedChild("AddSet"))
    Frame.MenuBar = Controls.MenuBar.New(Frame.Element:GetNamedChild("MenuBar"))
    Frame.MenuBar:DefaultPage()

	Dependencies.LibMainMenu:Init()

	-- Add to main menu
	local categoryLayoutInfo = {
		binding = "MYCOLLECTION_MENU_TOGGLE",
		categoryName = MYCOLLECTION_NAME,
		callback = function(buttonData)
			if not SceneManager:IsShowing(Frame.sceneName) then
                SceneManager:Show(Frame.sceneName)
                Frame:RefreshUI()
			else
				SceneManager:ShowBaseScene()
			end
		end,
		visible = function(buttonData)
			return true
        end,

		normal = "esoui/art/collections/collections_tabicon_outfitstyles_up.dds",
		pressed = "esoui/art/collections/collections_tabicon_outfitstyles_down.dds",
		highlight = "esoui/art/collections/collections_tabicon_outfitstyles_over.dds",
		disabled = "esoui/art/collections/collections_tabicon_outfitstyles_up.dds"
	}
	Dependencies.LibMainMenu:AddMenuItem(MyCollection.Name, Frame.sceneName, categoryLayoutInfo, nil)

    SlashCommands["/mycollection"] = Frame.ToggleOpenClose

    Frame.InitDialogs()
end

function Frame.InitDialogs()
    -- Dialogs
    ESO_Dialogs["MyCollection_SetOrderNumber"] = {
      title = {
          text = "Set Ordering number",
      },
      mainText = {
          text = "Custom ordering number for the tracked set. This is the default ordering value.",
      },
      --updateFn = function (dialog) d("uodate") d(dialog) d(self) end,
      --callback = function (dialog) d("setup") d(dialog) d(self) end,
      editBox = {
          textType = TEXT_TYPE_NUMERIC_UNSIGNED_INT,
          maxInputCharacters = 4,
          defaultText = 0,
      },
      buttons = {
          [1] = {
              text = "Set",
              visible = true,
              callback = function (dialog)
                  dialog.data.currentSet:SetOrderNumber(tonumber(ZO_Dialogs_GetEditBoxText(dialog)))
                  UI.Frame.Grid:RefreshData()
              end,
          },
          [2] = {
              text = "Cancel",
              visible = true,
              callback = function (dialog) end,
          },
      },
    }


end