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

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

#include "hudelement.h"
#include <vgui_controls/EditablePanel.h>
#include <vgui_controls/SectionedListPanel.h>
#include <vgui_controls/Frame.h>
#include <vgui_controls/Button.h>
#include <networkstringtabledefs.h>
#include "vgui_avatarimage.h"

extern INetworkStringTable *g_pStringTableServerMapCycle;

#ifdef TF_CLIENT_DLL
extern INetworkStringTable *g_pStringTableServerPopFiles;
extern INetworkStringTable *g_pStringTableServerMapCycleMvM;
#endif

static const int k_MAX_VOTE_NAME_LENGTH = 256;

namespace vgui
{
	class SectionedListPanel;
	class ComboBox;
	class ImageList;
};

struct VoteIssue_t
{
	char szName[k_MAX_VOTE_NAME_LENGTH];
	char szNameString[k_MAX_VOTE_NAME_LENGTH];
	bool bIsActive;
};

class VoteBarPanel : public vgui::Panel, public CGameEventListener
{
	DECLARE_CLASS_SIMPLE( VoteBarPanel, vgui::Panel );

	VoteBarPanel( vgui::Panel *parent, const char *panelName );

	virtual void Paint( void );
	virtual void FireGameEvent( IGameEvent *event );

private:
	int m_nVoteOptionCount[MAX_VOTE_OPTIONS];	// Vote options counter
	int m_nPotentialVotes;						// If set, draw a line at this point to show the required bar length

	CPanelAnimationVarAliasType( int, m_iBoxSize, "box_size", "16", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iSpacer, "spacer", "4", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iBoxInset, "box_inset", "1", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_nYesTextureId, "yes_texture", "vgui/hud/vote_yes", "textureid" );
	CPanelAnimationVarAliasType( int, m_nNoTextureId, "no_texture", "vgui/hud/vote_no", "textureid" );
};

//-----------------------------------------------------------------------------
// Purpose: A selection UI for votes that require additional parameters - such as players, maps
//-----------------------------------------------------------------------------

class CVoteSetupDialog : public vgui::Frame
{
	DECLARE_CLASS_SIMPLE( CVoteSetupDialog, vgui::Frame ); 

public:
	CVoteSetupDialog( vgui::Panel *parent );
	~CVoteSetupDialog();

	virtual void	Activate();
	virtual void	ApplySchemeSettings( vgui::IScheme *pScheme );
	virtual void	PostApplySchemeSettings( vgui::IScheme *pScheme );
	virtual void	ApplySettings(KeyValues *inResourceData);

	void			InitializeIssueList( void );
	void			UpdateCurrentMap( void );
	void			AddVoteIssues( CUtlVector< VoteIssue_t > &m_VoteSetupIssues );
	void			AddVoteIssueParams_MapCycle( CUtlStringList &m_VoteSetupMapCycle );

#ifdef TF_CLIENT_DLL
	void			AddVoteIssueParams_PopFiles( CUtlStringList &m_VoteSetupPopFiles );
#endif

private:
	//MESSAGE_FUNC( OnItemSelected, "ItemSelected" );
	MESSAGE_FUNC_PTR( OnItemSelected, "ItemSelected", panel );

	virtual void	OnCommand( const char *command );
	virtual void	OnClose( void );

	void			RefreshIssueParameters( void );
	void			ResetData( void );

	vgui::ComboBox				*m_pComboBox;

	vgui::SectionedListPanel	*m_pVoteSetupList;
	vgui::SectionedListPanel	*m_pVoteParameterList;
	vgui::Button				*m_pCallVoteButton;
	vgui::ImageList				*m_pImageList;

	CUtlVector< VoteIssue_t >	m_VoteIssues;
	CUtlVector<const char*>	m_VoteIssuesMapCycle;

#ifdef TF_CLIENT_DLL
	CUtlVector<const char*>	m_VoteIssuesPopFiles;
#endif

	CPanelAnimationVarAliasType( int, m_iIssueWidth, "issue_width", "100", "proportional_int" );
	CPanelAnimationVarAliasType( int, m_iParameterWidth, "parameter_width", "150", "proportional_int" );

	bool			m_bVoteButtonEnabled;
	char			m_szCurrentMap[MAX_MAP_NAME];

	vgui::HFont		m_hHeaderFont;
	Color			m_HeaderFGColor;
	vgui::HFont		m_hIssueFont;
	Color			m_IssueFGColor;
	Color			m_IssueFGColorDisabled;
};


class CHudVote : public vgui::EditablePanel, public CHudElement
{
	DECLARE_CLASS_SIMPLE( CHudVote, vgui::EditablePanel );

	CHudVote( const char *pElementName );

	virtual void	LevelInit( void );
	virtual void	Init( void );
	virtual bool	ShouldDraw( void );
	virtual void	ApplySchemeSettings( vgui::IScheme *pScheme );
	virtual void	FireGameEvent( IGameEvent *event );
	virtual void	OnThink();
	virtual int		KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding );

	// NOTE: Any MsgFunc_*() methods added here need to check IsPlayingDemo().
	void			MsgFunc_CallVoteFailed( bf_read &msg );
	void			MsgFunc_VoteStart( bf_read &msg );
	void			MsgFunc_VotePass( bf_read &msg );
	void			MsgFunc_VoteFailed( bf_read &msg );
	void			MsgFunc_VoteSetup( bf_read &msg );

	void			PropagateOptionParameters( void );
	void			ShowVoteUI( bool bShow ) { m_bShowVoteActivePanel = bShow; }
	bool			IsVoteUIActive( void );
	bool			IsVoteSystemActive( void ) { return m_bVoteSystemActive; }

	bool			IsShowingVoteSetupDialog();
	bool			IsShowingVotingUI();

	virtual GameActionSet_t GetPreferredActionSet() { return IsShowingVoteSetupDialog() ? GAME_ACTION_SET_MENUCONTROLS : CHudElement::GetPreferredActionSet(); }

private:
	bool			IsPlayingDemo() const;

	EditablePanel		*m_pVoteActive;
	vgui::Label			*m_pVoteActiveIssueLabel;
	CAvatarImagePanel	*m_pVoteActiveTargetAvatar;
	VoteBarPanel		*m_voteBar;
	EditablePanel		*m_pVoteFailed;
	EditablePanel		*m_pVotePassed;
	EditablePanel		*m_pCallVoteFailed;
	CVoteSetupDialog	*m_pVoteSetupDialog;

	CUtlVector< VoteIssue_t > m_VoteSetupIssues;
	CUtlStringList		m_VoteSetupMapCycle;

	int					m_nVoteActiveIssueLabelX;
	int					m_nVoteActiveIssueLabelY;
	
#ifdef TF_CLIENT_DLL
	CUtlStringList		m_VoteSetupPopFiles;
#endif

	CUtlStringList		m_VoteSetupChoices;

	bool				m_bVotingActive;
	bool				m_bVoteSystemActive;
	float				m_flVoteResultCycleTime;	// what time will we cycle to the result
	float				m_flHideTime;				// what time will we hide
	bool				m_bVotePassed;				// what mode are we going to cycle to
	int					m_nVoteOptionCount[MAX_VOTE_OPTIONS];	// Vote options counter
	int					m_nPotentialVotes;						// If set, draw a line at this point to show the required bar length
	bool				m_bIsYesNoVote;
	int					m_nVoteChoicesCount;
	bool				m_bPlayerVoted;
	float				m_flPostVotedHideTime;
	bool				m_bShowVoteActivePanel;
	int					m_iVoteCallerIdx;
	int					m_nVoteTeamIndex;			// If defined, only players on this team will see/vote on the issue
};

#endif // HUD_VOTE_H