//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Round timer for team gamerules
//
//=============================================================================//

#ifndef TEAM_ROUND_TIMER_H
#define TEAM_ROUND_TIMER_H

#ifdef _WIN32
#pragma once
#endif

#ifdef CLIENT_DLL
#define CTeamRoundTimer C_TeamRoundTimer
#endif

class CTeamRoundTimer : public CBaseEntity
{
public:
	DECLARE_CLASS( CTeamRoundTimer, CBaseEntity );
	DECLARE_NETWORKCLASS();

	CTeamRoundTimer();
	virtual ~CTeamRoundTimer();

	virtual void Spawn( void );
	virtual void Precache( void );
	virtual void Activate( void );

	// Returns seconds to display.
	// When paused shows amount of time left once the timer is resumed
	virtual float GetTimeRemaining( void );
	virtual int GetTimerMaxLength( void );
	virtual bool ShowInHud( void );
	virtual bool StartPaused( void ){ return m_bStartPaused; }
	bool ShowTimeRemaining( void ) { return m_bShowTimeRemaining; }

	bool IsDisabled( void ) { return m_bIsDisabled; }
	int GetTimerState( void ){ return m_nState; }

	bool IsTimerPaused( void ) { return m_bTimerPaused; }
	
#ifdef CLIENT_DLL

	void InternalSetPaused( bool bPaused ) { m_bTimerPaused = bPaused; }

#else

	void	SetStopWatchTimeStamp( void );
	virtual void SetTimeRemaining( int iTimerSeconds ); // Set the initial length of the timer
	virtual void AddTimerSeconds( int iSecondsToAdd, int iTeamResponsible = TEAM_UNASSIGNED ); // Add time to an already running ( or paused ) timer
	virtual void PauseTimer( void );
	virtual void ResumeTimer( void );
	virtual void SetAutoCountdown( bool bAuto ){ m_bAutoCountdown = bAuto; }

	void		 SetShowInHud( bool bShowInHUD ) { m_bShowInHUD = bShowInHUD; }

	int UpdateTransmitState();

	void InputEnable( inputdata_t &input );
	void InputDisable( inputdata_t &input );
	void InputPause( inputdata_t &input );
	void InputResume( inputdata_t &input );
	void InputSetTime( inputdata_t &input );
	void InputAddTime( inputdata_t &input );
	void InputRestart( inputdata_t &input );
	void InputShowInHUD( inputdata_t &input );
	void InputRoundSpawn( inputdata_t &inputdata );
	void InputSetMaxTime( inputdata_t &input );
	void InputAutoCountdown( inputdata_t &input );
	void InputAddTeamTime( inputdata_t &input );
	void InputSetSetupTime( inputdata_t &input );

#endif

	void SetCaptureWatchState( bool bCaptureWatch );
	bool IsWatchingTimeStamps( void ) { return m_bInCaptureWatchState; }
	void SetStopWatch( bool bState ) { m_bStopWatchTimer = bState; }
	bool IsStopWatchTimer( void ) { return m_bStopWatchTimer; }
	float GetStopWatchTotalTime( void ) { return m_flTotalTime; }
	bool IsRoundMaxTimerSet( void ) { return m_nTimerMaxLength > 0; }
	

private:
	void CalculateOutputMessages( void );

#ifdef CLIENT_DLL
	virtual void ClientThink();
	void OnPreDataChanged( DataUpdateType_t updateType );
	void OnDataChanged( DataUpdateType_t updateType );
	void SendTimeWarning( int nWarning );
	const char *GetTimeWarningSound( int nWarning );

#else
	void SetState( int nState, bool bFireOutput = true );
	void SetTimerThink( int nType );
	void EXPORT RoundTimerThink( void );
	void EXPORT RoundTimerSetupThink( void );

	static void SetActiveTimer( CTeamRoundTimer *pNewlyActive );
#endif

private:
	CNetworkVar( bool, m_bTimerPaused );
	CNetworkVar( float, m_flTimeRemaining );
	CNetworkVar( float, m_flTimerEndTime );	
	CNetworkVar( bool, m_bIsDisabled );
	CNetworkVar( bool, m_bShowInHUD );
	CNetworkVar( int, m_nTimerLength );			// current timer's length (used in the timer panel if no max length is set)
	CNetworkVar( int, m_nTimerInitialLength );	// initial length of the timer
	CNetworkVar( int, m_nTimerMaxLength );		// max time the timer can have (0 is no max)
	CNetworkVar( bool, m_bAutoCountdown );		// automatically count down the end of a round
	CNetworkVar( int, m_nSetupTimeLength );		// current timer's setup time length (setup time is the time before the round begins)
	CNetworkVar( int, m_nState );				// RT_STATE_SETUP or RT_STATE_NORMAL
	CNetworkVar( bool, m_bStartPaused );		// start the timer paused when it spawns
	CNetworkVar( bool, m_bShowTimeRemaining );  //show how much time is left (default) instead of how much time has passed.
	CNetworkVar( bool, m_bInCaptureWatchState );
	CNetworkVar( float, m_flTotalTime );
	CNetworkVar( bool, m_bStopWatchTimer );

	bool			m_bFireFinished;
	bool			m_bFire5MinRemain;
	bool			m_bFire4MinRemain;
	bool			m_bFire3MinRemain;
	bool			m_bFire2MinRemain;
	bool			m_bFire1MinRemain;
	bool			m_bFire30SecRemain;
	bool			m_bFire10SecRemain;
	bool			m_bFire5SecRemain;
	bool			m_bFire4SecRemain;
	bool			m_bFire3SecRemain;
	bool			m_bFire2SecRemain;
	bool			m_bFire1SecRemain;

#ifdef CLIENT_DLL 

	int				m_nOldTimerLength;
	int				m_nOldTimerState;

#else
	COutputEvent	m_OnRoundStart;
	COutputEvent	m_OnFinished;
	COutputEvent	m_On5MinRemain;
	COutputEvent	m_On4MinRemain;
	COutputEvent	m_On3MinRemain;
	COutputEvent	m_On2MinRemain;
	COutputEvent	m_On1MinRemain;
	COutputEvent	m_On30SecRemain;
	COutputEvent	m_On10SecRemain;
	COutputEvent	m_On5SecRemain;
	COutputEvent	m_On4SecRemain;
	COutputEvent	m_On3SecRemain;
	COutputEvent	m_On2SecRemain;
	COutputEvent	m_On1SecRemain;

	COutputEvent	m_OnSetupStart;
	COutputEvent	m_OnSetupFinished;

	float			m_flNextOvertimeNag;

	DECLARE_DATADESC();

	bool			m_bPauseDueToWin;
	bool			m_bResetTimeOnRoundStart;
	int				m_nTimeToUseAfterSetupFinished;
#endif 
};

#ifdef CLIENT_DLL
extern CTeamRoundTimer *g_TeamRoundTimer;
#endif

#endif	//TEAM_ROUND_TIMER_H