//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#ifndef QUEST_ITEM_PANEL_H
#define QUEST_ITEM_PANEL_H
#ifdef _WIN32
#pragma once
#endif

#include "econ_item_inventory.h"
#include "tf_controls.h"

using namespace vgui;

class CScrollableQuestList;
class CItemModelPanel;

//-----------------------------------------------------------------------------
// Simple tooltip class that looks into the moused-over panel's dialog variables
// for "tiptext" and uses that value as its string to present.
//-----------------------------------------------------------------------------
class CQuestTooltip : public CTFTextToolTip
{
	DECLARE_CLASS_SIMPLE( CQuestTooltip, CTFTextToolTip );
public:
	CQuestTooltip( vgui::Panel *parent, const char *text = NULL )
		: BaseClass( parent, text )
	{}

	virtual void ShowTooltip( Panel *pCurrentPanel ) OVERRIDE;
	virtual void PositionWindow( Panel *pTipPanel ) OVERRIDE;
private:
};

//-----------------------------------------------------------------------------
// Can pass various input events to other panels
//-----------------------------------------------------------------------------
class CInputProxyPanel : public EditablePanel
{
public:

	enum EInputTypes
	{
		INPUT_MOUSE_ENTER = 0,
		INPUT_MOUSE_EXIT,
		INPUT_MOUSE_PRESS,
		INPUT_MOUSE_DOUBLE_PRESS,
		INPUT_MOUSE_RELEASED,
		INPUT_MOUSE_WHEEL,
		INPUT_MOUSE_MOVE,
		NUM_INPUT_TYPES,
	};

	DECLARE_CLASS_SIMPLE( CInputProxyPanel, EditablePanel );
	CInputProxyPanel( Panel *parent, const char *pszPanelName );

	void AddPanelForCommand( EInputTypes eInputType, Panel* pPanel, const char* pszCommand );

	MESSAGE_FUNC_INT_INT( OnCursorMoved, "OnCursorMoved", x, y );
	virtual void OnCursorEntered();
	virtual void OnCursorExited();
	virtual void OnMousePressed(MouseCode code);
	virtual void OnMouseDoublePressed(MouseCode code);
	virtual void OnMouseReleased(MouseCode code);
	virtual void OnMouseWheeled(int delta);

private:

	struct CommandPair_t
	{
		Panel* m_pPanel;
		const char* m_pszCommand;
	};
	CUtlVector< CommandPair_t > m_vecRedirectPanels[NUM_INPUT_TYPES];
};

//-----------------------------------------------------------------------------
// Contains a panel that animates into place when it needs to show or hide
//-----------------------------------------------------------------------------
class CQuestStatusPanel : public EditablePanel
{
public:
	DECLARE_CLASS_SIMPLE( CQuestStatusPanel, EditablePanel );
	CQuestStatusPanel( Panel *parent, const char *pszPanelName );

	void SetShow( bool bShow );
	virtual void OnThink() OVERRIDE;

private:
	EditablePanel* m_pMovingContainer;
	RealTimeCountdownTimer m_transitionTimer;
	bool m_bShouldBeVisible;

	CPanelAnimationVarAliasType( int, m_iVisibleY, "visible_y", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iHiddenY, "hidden_y", "40", "proportional_int" );
};

//-----------------------------------------------------------------------------
// An representation of a single quest
//-----------------------------------------------------------------------------
class CQuestItemPanel : public EditablePanel, CGameEventListener
{
public:
	enum EItemPanelState_t
	{
		STATE_NORMAL = 0,
		STATE_UNIDENTIFIED,
		STATE_IDENTIFYING,
		STATE_COMPLETED,
		STATE_TURNING_IN__WAITING_FOR_GC,
		STATE_TURNING_IN__GC_RESPONDED,
		STATE_SHOW_ACCEPTED,

		NUM_STATES,
	};

	DECLARE_CLASS_SIMPLE( CQuestItemPanel, EditablePanel );

	CQuestItemPanel( Panel *parent, const char *pszPanelName, CEconItemView* pQuestItem, CScrollableQuestList* pQuestList );
	virtual ~CQuestItemPanel();

	virtual void ApplySchemeSettings( IScheme *pScheme ) OVERRIDE;
	virtual void ApplySettings( KeyValues *inResourceData ) OVERRIDE;
	virtual void PerformLayout( void ) OVERRIDE;
	virtual void OnCommand( const char *command ) OVERRIDE;
	virtual void OnThink() OVERRIDE;
	virtual void FireGameEvent( IGameEvent *event ) OVERRIDE;
	virtual void OnSizeChanged(int wide, int tall) OVERRIDE {}
	virtual void OnMouseReleased(MouseCode code) OVERRIDE;

	const CEconItemView* GetItem() { return m_hQuestItem; }
	void SetItem( CEconItemView* pItem );
	void QuestCompletedResponse();
	EItemPanelState_t GetState() const { return m_eState; }
	void SetSelected( bool bSelected, bool bImmediate );
	bool IsSelected() const { return !m_bCollapsed; }
	bool IsCursorOverMainContainer() const;

	MESSAGE_FUNC( OnCollapsedGlowStart, "CollapsedGlowStart" );
	MESSAGE_FUNC( OnCollapsedGlowEnd, "CollapsedGlowEnd" );
	MESSAGE_FUNC( OnDiscardQuest, "DiscardQuest" );
	MESSAGE_FUNC( OnEquipLoaners, "EquipLoaners" );
	void OnCompleteQuest();
	void OnConfirmDelete( bool bConfirm );
	void OnConfirmEquipLoaners( bool bConfirm );

protected:

	bool HasAllControls() const { return m_bHasAllControls; }

	void LoadResFileForCurrentItem();
	void OnIdentify();
	void SetupObjectivesPanels( bool bRecreate );
	bool IsUnacknowledged();
	void SetState( EItemPanelState_t eState );
	void CaptureAndEncodeStrings();
	const wchar_t* GetDecodedString( const char* pszKeyName, float flPercentDecoded );
	void UpdateInvalidReasons();

	EItemPanelState_t m_eState;
	CEconItemViewHandle m_hQuestItem;

	EditablePanel	*m_pQuestPaperContainer;
	EditablePanel	*m_pFrontFolderContainer;
	ImagePanel		*m_pFrontFolderImage;
	EditablePanel	*m_pBackFolderContainer;
	ImagePanel		*m_pBackFolderImage;
	ImagePanel		*m_pEncodedImage;
	EditablePanel	*m_pMainContainer;

	CQuestStatusPanel					*m_pEncodedStatus;
	CQuestStatusPanel					*m_pInactiveStatus;
	CQuestStatusPanel					*m_pReadyToTurnInStatus;
	Label								*m_pFlavorText;
	Label								*m_pObjectiveExplanationLabel;
	Label								*m_pExpirationLabel;
	EditablePanel						*m_pTurnInContainer;
	EditablePanel						*m_pTurnInDimmer;
	Button								*m_pTurnInButton;
	EditablePanel						*m_pTurnInSpinnerContainer;
	CExButton							*m_pTitleButton;
	EditablePanel						*m_pIdentifyDimmer;
	EditablePanel						*m_pIdentifyContainer;
	CExButton							*m_pIdentifyButton;
	ImagePanel							*m_pPhotoStatic;
	ImagePanel							*m_pAcceptedImage;
	Label								*m_pTurningInLabel;
	class CExScrollingEditablePanel		*m_pFlavorScrollingContainer;
	CExButton							*m_pFindServerButton;
	
	// loaners
	EditablePanel						*m_pLoanerContainerPanel;
	CExButton							*m_pRequestLoanerItemsButton;
	CExButton							*m_pEquipLoanerItemsButton;
	CItemModelPanel						*m_pLoanerItemModelPanel[2];

	CExButton							*m_pDiscardButton;


	int									m_nPaperXPos;
	int									m_nPaperYPos;	
	int									m_nPaperXShakePos;
	int									m_nPaperYShakePos;
	bool								m_bHasAllControls;
	CUtlString							m_strItemTrackerResFile;
	CUtlString							m_strQuickPlayMap;
	
	CUtlString							m_strMatchmakingGroupName;
	CUtlString							m_strMatchmakingCategoryName;
	CUtlString							m_strMatchmakingMapName;

	// Sound effects
	CUtlString							m_strExpandSound;
	CUtlString							m_strCollapseSound;
	CUtlString							m_strTurnInSound;
	CUtlString							m_strTurnInSuccessSound;
	CUtlString							m_strDecodeSound;

	// Animation
	CUtlString							m_strReset;
	CUtlString							m_strAnimExpand;
	CUtlString							m_strAnimCollapse;
	CUtlString							m_strTurningIn;
	CUtlString							m_strHighlightOn;
	CUtlString							m_strHighlightOff;

	class CItemTrackerPanel *m_pItemTrackerPanel;

	CScrollableQuestList *m_pQuestList;

	RealTimeCountdownTimer	m_StateTimer;
	KeyValues *m_pKVItemTracker;

	struct FolderPair_t
	{
		CUtlString m_strFront;
		CUtlString m_strBack;
	};
	CUtlVector< FolderPair_t > m_vecFoldersImages;

	CUtlString m_strEncodedText;
	CUtlString m_strExpireText;
	const char *m_pszCompleteSound;
	bool m_bCollapsed;

	KeyValues *m_pKVCipherStrings;

	CPanelAnimationVarAliasType( int, m_iFrontPaperHideHeight, "front_paper_hide_height", "1000", "proportional_int" ); // Default to a large value so it wont be visible
	CPanelAnimationVarAliasType( int, m_iUnidentifiedHeight, "unidentified_height", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iObjectiveInset, "objective_inset", "200", "proportional_int" );
	//CPanelAnimationVarAliasType( int, m_iScrollingContainerHeight, "scrolling_container_height", "200", "proportional_int" );

	enum EDecodeStyle
	{
		DECODE_STYLE_CYPHER = 0,
		DECODE_STYLE_PANEL_FADE,
	};
	CPanelAnimationVarAliasType( EDecodeStyle, m_eDecodeStyle, "decode_style", "0", "int" );
};

#endif // QUEST_ITEM_PANEL_H