//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: MiniMap.h: interface for the CMiniMap class.
//
// $NoKeywords: $
//=============================================================================//

#if !defined HLTVPANEL_H
#define HLTVPANEL_H
#ifdef _WIN32
#pragma once
#endif

#include <vgui_controls/Panel.h>
#include <game/client/iviewport.h>
#include "mathlib/vector.h"
#include <igameevents.h>
#include <shareddefs.h>
#include <const.h>
#include "hudelement.h"

class IMapOverviewPanel
{
public:
	virtual void SetMode( int mode ) = 0;
	virtual int GetMode( void ) = 0;
	virtual void FlashEntity( int entityID ) = 0;
	virtual void SetPlayerPositions(int index, const Vector &position, const QAngle &angle) = 0;
	virtual void SetVisible(bool state) = 0;
	virtual float GetZoom( void ) = 0;
	virtual vgui::Panel *GetAsPanel() = 0;
	virtual bool AllowConCommandsWhileAlive() = 0;
	virtual void SetPlayerPreferredMode( int mode ) = 0;
	virtual void SetPlayerPreferredViewSize( float viewSize ) = 0;
	virtual bool IsVisible() = 0;
	virtual void GetBounds(int &x, int &y, int &wide, int &tall) = 0;
	virtual float GetFullZoom( void ) = 0;
	virtual float GetMapScale( void ) = 0;
};

#define MAX_TRAIL_LENGTH	30
#define OVERVIEW_MAP_SIZE	1024	// an overview map is 1024x1024 pixels

typedef bool ( *FnCustomMapOverviewObjectPaint )( int textureID, Vector pos, float scale, float angle, const char *text, Color *textColor, float status, Color *statusColor );


class CMapOverview : public CHudElement, public vgui::Panel, public IMapOverviewPanel
{
	DECLARE_CLASS_SIMPLE( CMapOverview, vgui::Panel );

public:	

	enum
	{
		MAP_MODE_OFF = 0,	// Totally off
		MAP_MODE_INSET,		// A little map up in a corner
		MAP_MODE_FULL,		// Full screen, full map
		MAP_MODE_RADAR		// In game radar, extra functionality
	};

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

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

protected:	// private structures & types

	float GetViewAngle( void ); // The angle that determines the viewport twist from map texture to panel drawing.

	// list of game events the hLTV takes care of

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

	typedef struct MapPlayer_s {
		int		index;		// player's index
		int		userid;		// user ID on server
		int		icon;		// players texture icon ID
		Color   color;		// players team color
		char	name[MAX_PLAYER_NAME_LENGTH];
		int		team;		// N,T,CT
		int		health;		// 0..100, 7 bit
		Vector	position;	// current x,y pos
		QAngle	angle;		// view origin 0..360
		Vector2D trail[MAX_TRAIL_LENGTH];	// save 1 footstep each second for 1 minute
	} MapPlayer_t;

	typedef struct MapObject_s {
		int		objectID;	// unique object ID
		int		index;		// entity index if any
		int		icon;		// players texture icon ID
		Color   color;		// players team color
		char	name[MAX_PLAYER_NAME_LENGTH];	// show text under icon
		Vector	position;	// current x,y pos
		QAngle	angle;		// view origin 0..360
		float	endtime;	// time stop showing object
		float	size;		// object size
		float	status;		// green status bar [0..1], -1 = disabled
		Color	statusColor;	// color of status bar
		int		flags;		// MAB_OBJECT_*
		const char *text;	// text to draw underneath the icon
	} MapObject_t;

#define MAP_OBJECT_ALIGN_TO_MAP	(1<<0)

public: // IViewPortPanel interface:

	virtual const char *GetName( void ) { return PANEL_OVERVIEW; }
	virtual void SetData(KeyValues *data);
	virtual void Reset();
	virtual void OnThink();
	virtual void Update();
	virtual bool NeedsUpdate( void );
	virtual bool HasInputElements( void ) { return false; }
	virtual void ShowPanel( bool bShow );
	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 GetBounds(int &x, int &y, int &wide, int &tall) { BaseClass::GetBounds(x, y, wide, tall); }
	virtual void SetParent(vgui::VPANEL parent) { BaseClass::SetParent(parent); }

public: // IGameEventListener

	virtual void FireGameEvent( IGameEvent *event);

public:	// VGUI overrides

	virtual void Paint();
	virtual void OnMousePressed( vgui::MouseCode code );
	virtual void ApplySchemeSettings(vgui::IScheme *scheme);
	virtual void SetVisible(bool state){BaseClass::SetVisible(state);}

public:

	virtual float GetZoom( void );
	virtual int GetMode( void );
	virtual float GetFullZoom( void ){ return m_fFullZoom; }
	virtual float GetMapScale( void ){ return m_fMapScale; }

	// Player settings:
	virtual void ShowPlayerNames(bool state);
	virtual void ShowPlayerHealth(bool state);
	virtual void ShowPlayerTracks(float seconds); 
	virtual void SetPlayerPositions(int index, const Vector &position, const QAngle &angle);

	// general settings:
	virtual void SetMap(const char * map);
	virtual void SetTime( float time );
	virtual void SetMode( int mode );
	virtual bool SetTeamColor(int team, Color color);
	virtual void SetFollowAngle(bool state);
	virtual void SetFollowEntity(int entindex); // 0 = off
	virtual void SetCenter( const Vector2D &mappos); 
	virtual void SetAngle( float angle);
	virtual Vector2D WorldToMap( const Vector &worldpos );

	// Object settings
	virtual int		AddObject( const char *icon, int entity, float timeToLive ); // returns object ID, 0 = no entity, -1 = forever
	virtual void	SetObjectIcon( int objectID, const char *icon, float size );  // icon world size
	virtual void	SetObjectText( int objectID, const char *text, Color color ); // text under icon
	virtual void	SetObjectStatus( int objectID, float value, Color statusColor ); // status bar under icon
	virtual void	SetObjectPosition( int objectID, const Vector &position, const QAngle &angle ); // world pos/angles
	virtual void 	AddObjectFlags( int objectID, int flags );
	virtual void 	SetObjectFlags( int objectID, int flags );
	virtual void	RemoveObject( int objectID );
	virtual void	RemoveObjectByIndex( int index );
	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);

	/// allows mods to restrict health
	virtual bool CanPlayerHealthBeSeen(MapPlayer_t *player);

	/// allows mods to restrict names (e.g. CS when mp_playerid is non-zero)
	virtual bool CanPlayerNameBeSeen(MapPlayer_t *player);

	virtual int GetIconNumberFromTeamNumber( int teamNumber ){return teamNumber;}

protected:

	virtual void	DrawCamera();
	virtual void	DrawObjects();
	virtual void	DrawMapTexture();
	virtual void	DrawMapPlayers();
	virtual void	DrawMapPlayerTrails();
	virtual void	UpdatePlayerTrails();
	virtual void	ResetRound();
	virtual void	InitTeamColorsAndIcons();
	virtual void	UpdateSizeAndPosition();
	virtual bool	RunHudAnimations(){ return true; }

	bool			IsInPanel(Vector2D &pos);
	MapPlayer_t*	GetPlayerByUserID( int userID );
	int				AddIconTexture(const char *filename);
	Vector2D		MapToPanel( const Vector2D &mappos );
	int				GetPixelOffset( float height );
	void			UpdateFollowEntity();
	virtual void	UpdatePlayers();
	void			UpdateObjects(); // objects bound to entities 
	MapObject_t*	FindObjectByID(int objectID);
	virtual bool	IsRadarLocked() {return false;}

	virtual bool	DrawIcon( MapObject_t *obj );

	/*virtual bool	DrawIcon(	int textureID,
								int offscreenTextureID,
								Vector pos,
								float scale,
								float angle,
								int alpha = 255,
								const char *text = NULL,
								Color *textColor = NULL,
								float status = -1,
								Color *statusColor = NULL,
								int objectType = OBJECT_TYPE_NORMAL );*/
	
	int				m_nMode;
	Vector2D		m_vPosition;
	Vector2D		m_vSize;
	float			m_flChangeSpeed;
	float			m_flIconSize;


	IViewPort *		m_pViewPort;
	MapPlayer_t		m_Players[MAX_PLAYERS];
	CUtlDict< int, int> m_TextureIDs;
	CUtlVector<MapObject_t>	m_Objects;

	Color	m_TeamColors[MAX_TEAMS];
	int		m_TeamIcons[MAX_TEAMS];
	int		m_ObjectIcons[64];
	int		m_ObjectCounterID;
	vgui::HFont	m_hIconFont;


	bool m_bShowNames;
	bool m_bShowTrails;
	bool m_bShowHealth;

	int	 m_nMapTextureID;		// texture id for current overview image

	KeyValues * m_MapKeyValues; // keyvalues describing overview parameters

	Vector	m_MapOrigin;	// read from KeyValues files
	float	m_fMapScale;	// origin and scale used when screenshot was made
	bool	m_bRotateMap;	// if true roatate map around 90 degress, so it fits better to 4:3 screen ratio

	int		m_nFollowEntity;// entity number to follow, 0 = off
	CPanelAnimationVar( float, m_fZoom, "zoom", "1.0" );	// current zoom n = overview panel shows 1/n^2 of whole map'
	float	m_fFullZoom;	// best zoom factor for full map view (1.0 is map is a square) 
	Vector2D m_ViewOrigin;	// map coordinates that are in the center of the pverview panel
	Vector2D m_MapCenter;	// map coordinates that are in the center of the pverview panel

	float	m_fNextUpdateTime;
	float	m_fViewAngle;	// rotation of overview map
	float	m_fWorldTime;	// current world time
	float   m_fNextTrailUpdate; // next time to update player trails
	float	m_fTrailUpdateInterval; // if -1 don't show trails
	bool	m_bFollowAngle;	// if true, map rotates with view angle


};

extern IMapOverviewPanel *g_pMapOverview;

#endif //