#pragma once
#include "UILayer.h"
#include "UIEnums.h"

class UIComponent_Tooltips;
class UIComponent_TutorialPopup;
class UIScene_HUD;
class UIComponent_PressStartToPlay;

// A group contains a collection of layers for a specific context (e.g. each player has 1 group)
class UIGroup
{
private:
	UILayer *m_layers[eUILayer_COUNT];

	UIComponent_Tooltips *m_tooltips;
	UIComponent_TutorialPopup *m_tutorialPopup;
	UIComponent_PressStartToPlay *m_pressStartToPlay;
	UIScene_HUD *m_hud;

	C4JRender::eViewportType m_viewportType;
	
	EUIGroup m_group;
	int m_iPad;
	
	bool m_bMenuDisplayed;
	bool m_bPauseMenuDisplayed;
	bool m_bContainerMenuDisplayed;
	bool m_bIgnoreAutosaveMenuDisplayed;
	bool m_bIgnorePlayerJoinMenuDisplayed;

	// Countdown in ticks to update focus state
	int m_updateFocusStateCountdown;

	int m_commandBufferList;

public:
	UIGroup(EUIGroup group, int iPad);

	UIComponent_Tooltips *getTooltips() { return m_tooltips; }
	UIComponent_TutorialPopup *getTutorialPopup() { return m_tutorialPopup; }
	UIScene_HUD *getHUD() { return m_hud; }
	UIComponent_PressStartToPlay *getPressStartToPlay() { return m_pressStartToPlay; }

	void DestroyAll();
	void ReloadAll();

	void tick();
	void render();
	bool hidesLowerScenes();
	void getRenderDimensions(S32 &width, S32 &height);

	// NAVIGATION
	bool NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer);
	bool NavigateBack(int iPad, EUIScene eScene, EUILayer eLayer = eUILayer_COUNT);
	void closeAllScenes();
	UIScene *GetTopScene(EUILayer layer);

	bool IsSceneInStack(EUIScene scene);
	bool HasFocus(int iPad);

	bool RequestFocus(UILayer* layerPtr);
	void UpdateFocusState();

	bool GetMenuDisplayed();
	bool IsPauseMenuDisplayed() { return m_bPauseMenuDisplayed; }
	bool IsContainerMenuDisplayed() { return m_bContainerMenuDisplayed; }
	bool IsIgnoreAutosaveMenuDisplayed() { return m_bIgnoreAutosaveMenuDisplayed; }
	bool IsIgnorePlayerJoinMenuDisplayed() { return m_bIgnorePlayerJoinMenuDisplayed; }

	// INPUT
	void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled);


	// FOCUS
	bool getFocusState();

	// A component is an element on a layer that displays BELOW other scenes in this layer, but does not engage in any navigation
	// E.g. you can keep a component active while performing navigation with other scenes on this layer
	void showComponent(int iPad, EUIScene scene, EUILayer layer, bool show);
	UIScene *addComponent(int iPad, EUIScene scene, EUILayer layer);
	void removeComponent(EUIScene scene, EUILayer layer);

	void SetViewportType(C4JRender::eViewportType type);
	C4JRender::eViewportType GetViewportType();
	
	virtual void HandleDLCMountingComplete();
	virtual void HandleDLCInstalled();
	bool IsFullscreenGroup();

	void handleUnlockFullVersion();
	
	void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic);

	unsigned int GetLayerIndex(UILayer* layerPtr);

	int getCommandBufferList();
	UIScene *FindScene(EUIScene sceneType);

private:	
	void _UpdateFocusState();
	void updateStackStates();
};
