-- scene related functions (show/hide/determine/register)


function IIfA:GetCurrentSceneName()
	local ret = IIfA.EMPTY_STRING

	-- [16:20] scene name: 65553, hidden: false
	if not SCENE_MANAGER or not SCENE_MANAGER:GetCurrentScene() then
		ret = "hud"
	elseif SCENE_MANAGER:GetCurrentScene().name == "hudui" then
		ret = "hud"
	else
		ret = SCENE_MANAGER:GetCurrentScene().name
	end

	if tostring(ret) == "65553" then ret = "hud" end

	return ret
end

function IIfA:RegisterForSceneChanges()
	local scenes = IIfA:GetSettings().frameSettings
	for sceneName, settings in pairs(scenes) do
		if (sceneName ~= "hudui") then
			local scene = SCENE_MANAGER:GetScene(sceneName)
			if scene then
				scene:RegisterCallback("StateChange", function(...)
					IIfA:ProcessSceneChange(sceneName, ...)
				end)
			end
-- for reasons unknown, hudui doesn't always appear to be "found" for items in the list (get cur scene from scene_manager sometimes says hud, when it's hudui), force it to work same as HUD here
			if (sceneName == "hud") then
				local scene = SCENE_MANAGER:GetScene("hudui")
				scene:RegisterCallback("StateChange", function(...)
					IIfA:ProcessSceneChange(sceneName, ...)
				end)
			end
		end
	end

	INVENTORY_FRAGMENT:RegisterCallback("StateChange", function(...)
	   	IIfA:ProcessInventoryTabChange("", ...)
	end)
	CRAFT_BAG_FRAGMENT:RegisterCallback("StateChange", function(...)
	   	IIfA:ProcessInventoryTabChange("", ...)
	end)
	WALLET_FRAGMENT:RegisterCallback("StateChange", function(...)
	   	IIfA:ProcessInventoryTabChange("", ...)
	end)
	QUICKSLOT_FRAGMENT:RegisterCallback("StateChange", function(...)
	   	IIfA:ProcessInventoryTabChange("_quickSlots", ...)
	end)
end

function IIfA:GetSceneSettings(sceneName)

	sceneName = sceneName or IIfA:GetCurrentSceneName()
	local settings = IIfA:GetSettings().frameSettings
	if not settings[sceneName] then
		-- if we have to create a new set of scene info, register it in the scene change too, it'll be set again during next opening

		local scene = SCENE_MANAGER:GetScene(sceneName)
		if scene then
			scene:RegisterCallback("StateChange", function(...)
					IIfA:ProcessSceneChange(sceneName, ...)
				end)
		end
		-- save the settings in the settings table, base it on HUD
		settings[sceneName] = ZO_DeepTableCopy(settings["hud"])
		settings[sceneName].hidden = true
		settings[sceneName].docked = false
	end

	return settings[sceneName]

end


function IIfA:ProcessSceneChange(sceneName, oldState, newState)
	-- IIfA:DebugOut(zo_strformat("ProcessSceneChange <<1>>: <<2>> -> <<3>>", sceneName, oldState, newState))
	if SCENE_SHOWN == newState then
		sceneName = IIfA:GetCurrentSceneName()
		if sceneName == "inventory" then
			if not QUICKSLOT_FRAGMENT:IsHidden() then
				sceneName = sceneName .. "_quickslots"
			end
		end
		local settings = IIfA:GetSceneSettings(sceneName)
		self:RePositionFrame(settings)
	elseif SCENE_HIDDEN == newState then
		IIFA_GUI:SetHidden(true)
	end
end


function IIfA:ProcessInventoryTabChange(tabName, oldState, newState)
	-- IIfA:DebugOut(zo_strformat("ProcessSceneChange <<1>>: <<2>> -> <<3>>", oldState, newState))
	if newState == SCENE_SHOWN then
		sceneName = "inventory" .. tabName
		local settings = IIfA:GetSceneSettings(sceneName)
		self:RePositionFrame(settings)

	elseif SCENE_HIDDEN == newState then
		IIFA_GUI:SetHidden(true)
	end
end


function IIfA:SaveFrameInfo(calledFrom)
	if (calledFrom == "onHide") then return end

	local sceneName = IIfA:GetCurrentSceneName()
	if not QUICKSLOT_FRAGMENT:IsHidden() then
		sceneName = sceneName .. "_quickslots"
	end

	local settings = IIfA:GetSceneSettings(sceneName)

	settings.hidden = IIFA_GUI:IsControlHidden()

	if (not settings.docked and (calledFrom == "onMoveStop" or calledFrom == "onResizeStop")) then
		settings.lastX	= IIFA_GUI:GetLeft()
		settings.lastY	= IIFA_GUI:GetTop()
		if not settings.minimized then
			settings.width	= IIFA_GUI:GetWidth()
			settings.height	= IIFA_GUI:GetHeight()
		end
	end
end

-- called from bindings.xml on keypress, and on /iifa toggle chat cmd
function IIfA:ToggleInventoryFrame()
	IIFA_GUI:SetHidden(not IIFA_GUI:IsControlHidden())
	if not IIFA_GUI:IsControlHidden() then
		-- IIfA:OnFirstInventoryOpen()
		-- get current camera mode so when we toggle off, we put it back to where it was (maybe, can think of some weird circumstances where it might screw it up)
		SetGameCameraUIMode(true)
		IIfA:GuiResizeScroll()
		IIfA:RefreshInventoryScroll()
	end
	if not IIfA.data.dontFocusSearch then
		IIFA_GUI_SearchBox:TakeFocus()
	end
	IIfA:SaveFrameInfo("ToggleInventoryFrame")
end