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

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

#include <spectatorgui.h>
#include "hudelement.h"
#include "tf_hud_playerstatus.h"
#include "item_model_panel.h"
#include "tf_gamerules.h"
#include <vgui_controls/EditablePanel.h>

extern ConVar cl_use_tournament_specgui;
class CAvatarImagePanel;
class CTFPlayerPanel;

//-----------------------------------------------------------------------------
// Purpose: Custom health panel used to show spectator target's health
//-----------------------------------------------------------------------------
class CTFSpectatorGUIHealth : public CTFHudPlayerHealth
{
public:
	CTFSpectatorGUIHealth( Panel *parent, const char *name ) : CTFHudPlayerHealth( parent, name )
	{
	}

	virtual const char *GetResFilename( void ) 
	{ 
		return "resource/UI/SpectatorGUIHealth.res"; 
	}
	virtual void OnThink()
	{
		// Do nothing. We're just preventing the base health panel from updating.
	}
};


//-----------------------------------------------------------------------------
// Purpose: TF Spectator UI
//-----------------------------------------------------------------------------
class CTFSpectatorGUI : public CSpectatorGUI, public CGameEventListener
{
private:
	DECLARE_CLASS_SIMPLE( CTFSpectatorGUI, CSpectatorGUI );

public:
	CTFSpectatorGUI( IViewPort *pViewPort );
	~CTFSpectatorGUI( void );
		
	virtual void Reset( void );
	virtual void PerformLayout( void );
	virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
	virtual void ApplySettings( KeyValues *inResourceData );

	virtual void Update( void );
	virtual bool NeedsUpdate( void );
	virtual bool ShouldShowPlayerLabel( int specmode ) { return false; }
	void		 UpdateReinforcements( void );
	virtual void ShowPanel(bool bShow);
	virtual Color GetBlackBarColor( void ) { return Color(52,48,45, 255); }

	void		UpdateKeyLabels( void );

	virtual void FireGameEvent( IGameEvent *event );
	void		UpdateItemPanel( bool bForce = false );
	void		ForceItemPanelCycle( void );
	virtual const char *GetResFile( void );

	// Tournament mode handling
	bool		InTournamentGUI( void );
	void		RecalculatePlayerPanels( void );
	void		UpdatePlayerPanels( void );
	void		SelectSpec( int iSlot );

	virtual int GetTopBarHeight();

	virtual GameActionSet_t GetPreferredActionSet() { return GAME_ACTION_SET_SPECTATOR; }

protected:	
	int		m_nLastSpecMode;
	float	m_flNextTipChangeTime;		// time at which to next change the tip
	int		m_iTipClass;				// class that current tip is for

	// used to store the x and y position of the Engy and Spy build panels so we can reset them when the spec panel goes away
	int		m_nEngBuilds_xpos;
	int		m_nEngBuilds_ypos;
	int		m_nSpyBuilds_xpos;
	int		m_nSpyBuilds_ypos;

	int		m_nMannVsMachineStatus_xpos;
	int		m_nMannVsMachineStatus_ypos;

	vgui::Label				*m_pReinforcementsLabel;
	CExLabel				*m_pBuyBackLabel;
	vgui::Label				*m_pClassOrTeamLabel;
	CExLabel				*m_pClassOrTeamKeyLabel;
	vgui::Label				*m_pSwitchCamModeKeyLabel;
	vgui::Label				*m_pCycleTargetFwdKeyLabel;
	vgui::Label				*m_pCycleTargetRevKeyLabel;
	vgui::Label				*m_pMapLabel;
	CItemModelPanel			*m_pItemPanel;

	float					m_flNextItemPanelUpdate;
	EHANDLE					m_hPrevItemPlayer;
	int						m_iPrevItemShown;
	int						m_iFirstItemShown;
	bool					m_bShownItems;

	// Tournament mode player panel handling
	CUtlVector<CTFPlayerPanel*>	m_PlayerPanels;
	KeyValues				*m_pPlayerPanelKVs;
	bool					m_bReapplyPlayerPanelKVs;
	bool					m_bPrevTournamentMode;
	float					m_flNextPlayerPanelUpdate;

	// Coaching
	bool					m_bCoaching;
	CAvatarImagePanel		*m_pAvatar;
	CTFSpectatorGUIHealth	*m_pStudentHealth;

	CPanelAnimationVarAliasType( int, m_iTeam1PlayerBaseOffsetX, "team1_player_base_offset_x", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam1PlayerBaseX, "team1_player_base_x", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam1PlayerBaseY, "team1_player_base_y", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam2PlayerBaseX, "team2_player_base_x", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam2PlayerBaseOffsetX, "team2_player_base_offset_x", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam2PlayerBaseY, "team2_player_base_y", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam1PlayerDeltaX, "team1_player_delta_x", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam1PlayerDeltaY, "team1_player_delta_y", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam2PlayerDeltaX, "team2_player_delta_x", "0", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iTeam2PlayerDeltaY, "team2_player_delta_y", "0", "proportional_int" );
};

#endif // TF_SPECTATORGUI_H