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

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

#include "spectatorgui.h"
#include "mapoverview.h"
#include "cs_shareddefs.h"

extern ConVar mp_playerid; // in cs_gamerules.h
extern ConVar mp_forcecamera; // in gamevars_shared.h
extern ConVar mp_fadetoblack;


//-----------------------------------------------------------------------------
// Purpose: Cstrike Spectator UI
//-----------------------------------------------------------------------------
class CCSSpectatorGUI : public CSpectatorGUI
{
private:
	DECLARE_CLASS_SIMPLE( CCSSpectatorGUI, CSpectatorGUI );

public:
	CCSSpectatorGUI( IViewPort *pViewPort );
		
	virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
	virtual void UpdateSpectatorPlayerList( void );
	virtual void Update( void );
	virtual bool NeedsUpdate( void );
	//=============================================================================
	// HPE_BEGIN:
	// [smessick]
	//=============================================================================
	virtual void ShowPanel( bool bShow );
	//=============================================================================
	// HPE_END
	//=============================================================================

protected:

	void UpdateTimer();
	void UpdateAccount();

	int		m_nLastAccount;
	int		m_nLastTime;
	int		m_nLastSpecMode;
	CBaseEntity	*m_nLastSpecTarget;

	void StoreWidths( void );
	void ResizeControls( void );
	bool ControlsPresent( void ) const;

	vgui::Label *m_pCTLabel;
	vgui::Label *m_pCTScore;
	vgui::Label *m_pTerLabel;
	vgui::Label *m_pTerScore;
	vgui::Label *m_pTimer;
	vgui::Label *m_pTimerLabel;
	vgui::Panel *m_pDivider;
	vgui::Label *m_pExtraInfo;

	bool m_modifiedWidths;

	int m_scoreWidth;
	int m_extraInfoWidth;
};

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////

#define DESIRED_RADAR_RESOLUTION 450 

class CCSMapOverview : public CMapOverview
{
	DECLARE_CLASS_SIMPLE( CCSMapOverview, CMapOverview );

public:	

	enum
	{
		MAP_ICON_T = 0,
		MAP_ICON_CT,
		MAP_ICON_HOSTAGE,
		MAP_ICON_COUNT
	};

	CCSMapOverview( const char *pElementName );
	virtual ~CCSMapOverview();

	virtual bool ShouldDraw( void );
	vgui::Panel *GetAsPanel(){ return this; }
	virtual bool AllowConCommandsWhileAlive(){return false;}
	virtual void SetPlayerPreferredMode( int mode );
	virtual void SetPlayerPreferredViewSize( float viewSize );
	virtual void ApplySchemeSettings( vgui::IScheme *scheme );

protected:	// private structures & types

	// list of game events the hLTV takes care of

	typedef struct {
		int		xpos;
		int		ypos;
	} FootStep_t;	

	// Extra stuff in a this-level parallel array
	typedef struct CSMapPlayer_s {
		int		overrideIcon; // if not -1, the icon to use instead
		int		overrideIconOffscreen; // to use with overrideIcon
		float	overrideFadeTime; // Time to start fading the override icon
		float	overrideExpirationTime; // Time to not use the override icon any more
		Vector	overridePosition; // Where the overridden icon will draw
		QAngle	overrideAngle; // And at what angle
		bool	isDead;		// Death latch, since client can be behind the times on health messages.
		float	timeLastSeen; // curtime that we last saw this guy.
		float	timeFirstSeen; // curtime that we started seeing this guy
		bool	isHostage;	// Not a full player, a hostage.  Special icon, different death event
		float	flashUntilTime;
		float	nextFlashPeakTime;
		int		currentFlashAlpha;
	} CSMapPlayer_t;

	typedef struct CSMapBomb_s
	{
		Vector position;

		enum BombState
		{
			BOMB_PLANTED,	//planted and ticking down
			BOMB_DROPPED,	//dropped and lying loose
			BOMB_CARRIED,	//in the arms of a player
			BOMB_GONE,		//defused or exploded, but was planted
			BOMB_INVALID	//no bomb
		};
		BombState state;

		float timeLastSeen;
		float timeFirstSeen;
		float timeFade;
		float timeGone;

		float currentRingRadius;
		float currentRingAlpha;
		float maxRingRadius;
		float ringTravelTime;
	} CSMapBomb_t;

	typedef struct CSMapGoal_s
	{
		Vector position;
		int iconToUse;
	} CSMapGoal_t;

public: // IViewPortPanel interface:

	virtual void Update();
	virtual void Init( void );

	// both vgui::Frame and IViewPortPanel define these, so explicitly define them here as passthroughs to vgui
	vgui::VPANEL GetVPanel( void ) { return BaseClass::GetVPanel(); }
	virtual bool IsVisible() { return BaseClass::IsVisible(); }
	virtual void SetParent(vgui::VPANEL parent) { BaseClass::SetParent(parent); }

	// IGameEventListener

	virtual void FireGameEvent( IGameEvent *event);

	// VGUI overrides

	// Player settings:
	void SetPlayerSeen( int index );
	void SetBombSeen( bool seen );

	// general settings:
	virtual void SetMap(const char * map);
	virtual void SetMode( int mode );

	// Object settings
	virtual void	FlashEntity( int entityID );

	// rules that define if you can see a player on the overview or not
	virtual bool CanPlayerBeSeen(MapPlayer_t *player);

	virtual int GetIconNumberFromTeamNumber( int teamNumber );

protected:

	virtual void	DrawCamera();
	virtual void	DrawMapTexture();
	virtual void	DrawMapPlayers();
	void			DrawHostages();
	void			DrawBomb();
	void			DrawGoalIcons();
	virtual void	ResetRound();
	virtual void	InitTeamColorsAndIcons();
	virtual void	UpdateSizeAndPosition();
	void			UpdateGoalIcons();
	void			ClearGoalIcons();
	virtual bool	IsRadarLocked();
	Vector2D		PanelToMap( const Vector2D &panelPos );

	bool			AdjustPointToPanel(Vector2D *pos);
	MapPlayer_t*	GetPlayerByEntityID( int entityID );
	MapPlayer_t*	GetHostageByEntityID( int entityID );
	virtual void	UpdatePlayers();
	void			UpdateHostages();///< Update hostages in the MapPlayer list
	void			UpdateBomb();
	void			UpdateFlashes();
	bool			CreateRadarImage(const char *mapName, const char *radarFileName);
	virtual bool	RunHudAnimations(){ return false; }

private:
	bool			DrawIconCS(	int textureID,
		int offscreenTextureID,
		Vector pos,
		float scale,
		float angle,
		int alpha,
		bool allowRotation = true,
		const char *text = NULL,
		Color *textColor = NULL,
		float status = -1,
		Color *statusColor = NULL 
		);

	int GetMasterAlpha( void );// The main alpha that the map part should be, determined by using the mode to look at the right convar
	int GetBorderSize( void );// How far in from the edge of the panel we draw, based on mode.  Let's the background fancy corners show.
	CSMapPlayer_t* GetCSInfoForPlayerIndex( int index );
	CSMapPlayer_t* GetCSInfoForPlayer(MapPlayer_t *player);
	CSMapPlayer_t* GetCSInfoForHostage(MapPlayer_t *hostage);
	bool CanHostageBeSeen(MapPlayer_t *hostage);

	CSMapPlayer_t	m_PlayersCSInfo[MAX_PLAYERS];
	CSMapBomb_t		m_bomb;
	MapPlayer_t		m_Hostages[MAX_HOSTAGES];
	CSMapPlayer_t	m_HostagesCSInfo[MAX_HOSTAGES];

	CUtlVector< CSMapGoal_t > m_goalIcons;
	bool m_goalIconsLoaded;

	int		m_TeamIconsSelf[MAP_ICON_COUNT];
	int		m_TeamIconsDead[MAP_ICON_COUNT];
	int		m_TeamIconsOffscreen[MAP_ICON_COUNT];
	int		m_TeamIconsDeadOffscreen[MAP_ICON_COUNT];

	int		m_bombIconPlanted;
	int		m_bombIconDropped;
	int		m_bombIconCarried;
	int		m_bombRingPlanted;
	int		m_bombRingDropped;
	int		m_bombRingCarried;
	int		m_bombRingCarriedOffscreen;
	int		m_radioFlash;
	int		m_radioFlashOffscreen;
	int		m_radarTint;
	int		m_hostageFollowing;
	int		m_hostageFollowingOffscreen;
	int		m_playerFacing;
	int		m_cameraIconFirst;
	int		m_cameraIconThird;
	int		m_cameraIconFree;
	int		m_hostageRescueIcon;
	int		m_bombSiteIconA;
	int		m_bombSiteIconB;

	int	 m_nRadarMapTextureID;	// texture id for radar version of current overview image

	int m_playerPreferredMode; // The mode the player wants to be in for when we aren't being the radar
};

#endif // CSSPECTATORGUI_H