//========= Copyright Valve Corporation, All rights reserved. ============//
//
//=======================================================================================//

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

#include "vgui_controls/EditablePanel.h"
#include "vgui_controls/CheckButton.h"
#include "inputsystem/iinputsystem.h"

//-----------------------------------------------------------------------------
// Purpose:
//   - Basic confirm dialog - derive from this and implement GetText().
//   - The user will have two options, essentially yes or no.
//   - A "ConfirmDlgResult" message is sent to the parent with the result.
//     Check the "confirmed" parameter.
//   - Panel deletes itself.
//   - See CConfirmDeleteDialog for a generic delete confirmation dialog.
//-----------------------------------------------------------------------------
class CExButton;
#ifdef TF_CLIENT_DLL
class CTFSpectatorGUIHealth;
#endif // TF_CLIENT_DLL

class CConfirmDialog : public vgui::EditablePanel
{
	DECLARE_CLASS_SIMPLE( CConfirmDialog, vgui::EditablePanel );
public:
	CConfirmDialog( vgui::Panel *parent );

	virtual const wchar_t *GetText() = 0;

	void Show( bool bMakePopup = true );
	void SetIconImage( const char *pszIcon );

protected:
	virtual void		OnSizeChanged(int nNewWide, int nNewTall );
	virtual void		ApplySchemeSettings( vgui::IScheme *pScheme );
	virtual void		OnCommand( const char *command );
	virtual void		OnKeyCodeTyped( vgui::KeyCode code );
	virtual void		OnKeyCodePressed( vgui::KeyCode code );
	virtual const char *GetResFile();

	void				FinishUp();		// Hide the panel, mark for deletion, remove from modal stack.

	CExButton		*m_pConfirmButton;
	CExButton		*m_pCancelButton;
	vgui::ImagePanel *m_pIcon;
};

//-----------------------------------------------------------------------------

typedef void (*GenericConfirmDialogCallback)( bool bConfirmed, void *pContext );

// An implementation of the Confirm Dialog that is "generic"
class CTFGenericConfirmDialog : public CConfirmDialog
{
	DECLARE_CLASS_SIMPLE( CTFGenericConfirmDialog, CConfirmDialog );
public:
	CTFGenericConfirmDialog( const char *pTitle, const char *pTextKey, const char *pConfirmBtnText,
		const char *pCancelBtnText, GenericConfirmDialogCallback callback, vgui::Panel *pParent );
	CTFGenericConfirmDialog( const char *pTitle, const wchar_t *pText, const char *pConfirmBtnText,
		const char *pCancelBtnText, GenericConfirmDialogCallback callback, vgui::Panel *pParent );
	virtual ~CTFGenericConfirmDialog();

	virtual const wchar_t *GetText();

	virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
	virtual void PerformLayout();
	virtual void OnCommand( const char *command );

	void SetStringTokens( KeyValues *pKeyValues );
	void AddStringToken( const char* pToken, const wchar_t* pValue );
	void SetContext( void *pContext );

protected:
	void CommonInit( const char *pTitle, const char *pConfirmBtnText, const char *pCancelBtnText,
		GenericConfirmDialogCallback callback, vgui::Panel *pParent );
		
	const char *m_pTitle;
	const char *m_pTextKey;	
	const char *m_pConfirmBtnText;
	const char *m_pCancelBtnText;

	KeyValues *m_pKeyValues;
	wchar_t m_wszBuffer[1024];
	GenericConfirmDialogCallback m_pCallback;
	void *m_pContext;
};

// A generic message dialog, which is just a generic confirm dialog w/o the cancel button
class CTFMessageBoxDialog : public CTFGenericConfirmDialog
{
	DECLARE_CLASS_SIMPLE( CTFMessageBoxDialog, CTFGenericConfirmDialog );
public:
	CTFMessageBoxDialog( const char *pTitle, const char *pText, const char *pConfirmBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent ) 
		:  CTFGenericConfirmDialog( pTitle, pText, pConfirmBtnText, NULL, callback, parent ) {}

	CTFMessageBoxDialog( const char *pTitle, const wchar_t *pText, const char *pConfirmBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent )
		:  CTFGenericConfirmDialog( pTitle, pText, pConfirmBtnText, NULL, callback, parent ) {}

	virtual const char* GetResFile();
};

// A generic message dialog, which is just a generic confirm dialog w/o the cancel button that plays a sound with optional delay
class CTFMessageBoxDialogWithSound : public CTFMessageBoxDialog
{
	DECLARE_CLASS_SIMPLE( CTFMessageBoxDialogWithSound, CTFMessageBoxDialog );
public:
	CTFMessageBoxDialogWithSound( const char *pTitle, const char *pText, const char *pszSound, float flDelay, const char *pConfirmBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent );
	CTFMessageBoxDialogWithSound( const char *pTitle, const wchar_t *pText, const char *pszSound, float flDelay, const char *pConfirmBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent );
	virtual void OnTick() OVERRIDE;

private:
	char	m_szSound[MAX_PATH];
	float	m_flSoundTime;
	bool	m_bPlayedSound;
};

// A dialog with an upgrade button that takes them to the mann co store
class CTFUpgradeBoxDialog : public CTFMessageBoxDialog
{
	DECLARE_CLASS_SIMPLE( CTFUpgradeBoxDialog, CTFMessageBoxDialog );
public:
	CTFUpgradeBoxDialog( const char *pTitle, const char *pText, const char *pConfirmBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent ) 
		:  CTFMessageBoxDialog( pTitle, pText, pConfirmBtnText, callback, parent ) {}

	CTFUpgradeBoxDialog( const char *pTitle, const wchar_t *pText, const char *pConfirmBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent )
		:  CTFMessageBoxDialog( pTitle, pText, pConfirmBtnText, callback, parent ) {}

	virtual const char *GetResFile()
	{
		return "Resource/UI/UpgradeBoxDialog.res";
	}
	virtual void OnCommand( const char *command );
};


// An implementation of the Confirm Dialog with a persistant "opt out" checkbox stored via ConVar
class CTFGenericConfirmOptOutDialog : public CTFGenericConfirmDialog
{
	DECLARE_CLASS_SIMPLE( CTFGenericConfirmOptOutDialog, CTFGenericConfirmDialog );
public:
	CTFGenericConfirmOptOutDialog( const char *pTitle, const char *pText, const char *pConfirmBtnText, const char *pCancelBtnText, const char *pOptOutText, const char *pOptOutConVarName, GenericConfirmDialogCallback callback, vgui::Panel *parent ) ;
	virtual ~CTFGenericConfirmOptOutDialog() { }

	virtual void ApplySchemeSettings( vgui::IScheme *pScheme );

	MESSAGE_FUNC_PARAMS( OnButtonChecked, "CheckButtonChecked", pData );

protected:
	virtual const char *GetResFile();

	const char *m_optOutText;

	vgui::CheckButton *m_optOutCheckbox;
	const char *m_optOutConVarName;
};

#ifdef TF_CLIENT_DLL
// A dialog presented to dead players when being revived
class CTFReviveDialog : public CTFMessageBoxDialog
{
	DECLARE_CLASS_SIMPLE( CTFReviveDialog, CTFMessageBoxDialog );
public:
	CTFReviveDialog( const char *pTitle, const char *pText, const char *pConfirmBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent );
	virtual ~CTFReviveDialog() { }

	virtual void PerformLayout() OVERRIDE;
	virtual void OnTick() OVERRIDE;
	virtual const char *GetResFile() OVERRIDE { return "Resource/UI/ReviveDialog.res"; }
	void SetOwner( CBaseEntity *pEntity );

	CTFSpectatorGUIHealth *m_pTargetHealth;
	CHandle< C_BaseEntity >	m_hEntity;
	float m_flPrevHealth;
};

CTFReviveDialog *ShowRevivePrompt( CBaseEntity *pOwner,
								   const char *pTitle = "#TF_Prompt_Revive_Title", 
								   const char *pText = "#TF_Prompt_Revive_Message",
								   const char *pConfirmBtnText = "#TF_Prompt_Revive_Cancel",
								   GenericConfirmDialogCallback callback = NULL,
								   vgui::Panel *parent = NULL,
								   void *pContext = NULL );


// A generic message dialog, which is just a generic confirm dialog w/o the cancel button
class CEconRequirementDialog : public CTFGenericConfirmDialog
{
	DECLARE_CLASS_SIMPLE( CEconRequirementDialog, CTFGenericConfirmDialog );
public:
	CEconRequirementDialog( const char *pTitle, const char *pTextKey, const char *pItemDefName );

	virtual const char *GetResFile() OVERRIDE;
	virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) OVERRIDE;
	virtual void OnCommand( const char *command ) OVERRIDE;

	CSchemaItemDefHandle m_hItemDef;
};

void ShowEconRequirementDialog( const char *pTitle, const char *pText, const char *pItemDefName );
#endif // TF_CLIENT_DLL

//-----------------------------------------------------------------------------

CTFGenericConfirmOptOutDialog *ShowConfirmOptOutDialog( const char *pTitle, const char *pText, const char *pConfirmBtnText, const char *pCancelBtnText, const char *pOptOutText, const char *pOptOutConVarName, GenericConfirmDialogCallback callback, vgui::Panel *parent = NULL );

//-----------------------------------------------------------------------------

CTFGenericConfirmDialog *ShowConfirmDialog( const char *pTitle, const char *pText, const char *pConfirmBtnText, const char *pCancelBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent = NULL, void *pContext = NULL, const char *pSound = NULL );

//-----------------------------------------------------------------------------

CTFMessageBoxDialog *ShowMessageBox( const char *pTitle, const char *pText, const char *pConfirmBtnText = "#GameUI_OK", GenericConfirmDialogCallback callback = NULL, vgui::Panel *parent = NULL, void *pContext = NULL );
CTFMessageBoxDialog *ShowMessageBox( const char *pTitle, const wchar_t *pText, const char *pConfirmBtnText = "#GameUI_OK", GenericConfirmDialogCallback callback = NULL, vgui::Panel *parent = NULL, void *pContext = NULL );
CTFMessageBoxDialog *ShowMessageBox( const char *pTitle, const char *pText, KeyValues *pKeyValues, const char *pConfirmBtnText = "#GameUI_OK", GenericConfirmDialogCallback callback = NULL, vgui::Panel *parent = NULL, void *pContext = NULL );
CTFMessageBoxDialog *ShowUpgradeMessageBox( const char *pTitle, const char *pText );
CTFMessageBoxDialog *ShowUpgradeMessageBox( const char *pTitle, const char *pText, const char *pConfirmBtnText, GenericConfirmDialogCallback callback, vgui::Panel *parent = NULL, void *pContext = NULL );

//-----------------------------------------------------------------------------
CTFMessageBoxDialogWithSound *ShowMessageBoxWithSound( const char *pTitle, const char *pText, const char *pszSound, float flDelay = 0.0, const char *pConfirmBtnText = "#GameUI_OK", GenericConfirmDialogCallback callback = NULL, vgui::Panel *parent = NULL, void *pContext = NULL );
CTFMessageBoxDialogWithSound *ShowMessageBoxWithSound( const char *pTitle, const wchar_t *pText, const char *pszSound, float flDelay = 0.0, const char *pConfirmBtnText = "#GameUI_OK", GenericConfirmDialogCallback callback = NULL, vgui::Panel *parent = NULL, void *pContext = NULL );
CTFMessageBoxDialogWithSound *ShowMessageBoxWithSound( const char *pTitle, const char *pText, KeyValues *pKeyValues, const char *pszSound, float flDelay = 0.0, const char *pConfirmBtnText = "#GameUI_OK", GenericConfirmDialogCallback callback = NULL, vgui::Panel *parent = NULL, void *pContext = NULL );

#endif // CONFIRM_DIALOG_H