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

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

#include "tf_shareddefs.h"
#include "tf_weaponbase.h"
#ifdef CLIENT_DLL
	#include "tf_hud_base_build_menu.h"
#endif

// Client specific.
#if defined( CLIENT_DLL ) 
	#define CTFWeaponPDA C_TFWeaponPDA
	#define CTFWeaponPDA_Engineer_Build	C_TFWeaponPDA_Engineer_Build
	#define CTFWeaponPDA_Engineer_Destroy	C_TFWeaponPDA_Engineer_Destroy
	#define CTFWeaponPDA_Spy		C_TFWeaponPDA_Spy
	#define CTFWeaponPDA_Spy_Build	C_TFWeaponPDA_Spy_Build
	
	#define CTFWeaponPDAExpansion_Dispenser		C_TFWeaponPDAExpansion_Dispenser
	#define CTFWeaponPDAExpansion_Teleporter	C_TFWeaponPDAExpansion_Teleporter
#endif

class CTFWeaponPDA : public CTFWeaponBase
{
public:
	DECLARE_CLASS( CTFWeaponPDA, CTFWeaponBase );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

#if !defined( CLIENT_DLL ) 
	DECLARE_DATADESC();
#endif

	CTFWeaponPDA();

	virtual void	Spawn();

#if !defined( CLIENT_DLL )
		virtual void	Precache();
		virtual void	GetControlPanelInfo( int nPanelIndex, const char *&pPanelName );
#else
		virtual float	CalcViewmodelBob( void );
		virtual CHudBaseBuildMenu *GetBuildMenu() const { return NULL; }
#endif

	virtual bool	ShouldShowControlPanels( void );

	virtual void	PrimaryAttack();
	virtual void	SecondaryAttack();
	virtual int		GetWeaponID( void ) const						{ return TF_WEAPON_PDA; }
	virtual bool	ShouldDrawCrosshair( void )						{ return false; }
	virtual bool	HasPrimaryAmmo()								{ return true; }
	virtual bool	CanBeSelected()									{ return true; }
#ifdef CLIENT_DLL
	virtual void	OnDataChanged( DataUpdateType_t type ) OVERRIDE;
	virtual void	UpdateOnRemove() OVERRIDE;
#endif

	virtual const char *GetPanelName() { return "pda_panel"; }


public:	
	CTFWeaponInfo	*m_pWeaponInfo;

private:
#ifdef CLIENT_DLL
	void HideBuildMenu() const;
#endif

	CTFWeaponPDA( const CTFWeaponPDA & ) {}
};

class CTFWeaponPDA_Engineer_Build : public CTFWeaponPDA
{
public:
	DECLARE_CLASS( CTFWeaponPDA_Engineer_Build, CTFWeaponPDA );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual const char *GetPanelName() { return ""; }
	virtual int		GetWeaponID( void ) const { return TF_WEAPON_PDA_ENGINEER_BUILD; }
#ifdef CLIENT_DLL
	virtual CHudBaseBuildMenu *GetBuildMenu() const OVERRIDE;
#endif
};

#ifdef CLIENT_DLL

extern ConVar tf_build_menu_controller_mode;

#endif
class CTFWeaponPDA_Engineer_Destroy : public CTFWeaponPDA
{
public:
	DECLARE_CLASS( CTFWeaponPDA_Engineer_Destroy, CTFWeaponPDA );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual const char *GetPanelName() { return ""; }
	virtual int		GetWeaponID( void ) const { return TF_WEAPON_PDA_ENGINEER_DESTROY; }
#ifdef CLIENT_DLL
	virtual CHudBaseBuildMenu *GetBuildMenu() const OVERRIDE;
#endif

	virtual bool	VisibleInWeaponSelection( void );
};

class CTFWeaponPDA_Spy : public CTFWeaponPDA
{
public:
	DECLARE_CLASS( CTFWeaponPDA_Spy, CTFWeaponPDA );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual const char *GetPanelName() { return ""; }
	virtual int		GetWeaponID( void ) const { return TF_WEAPON_PDA_SPY; }
#ifdef CLIENT_DLL
	virtual CHudBaseBuildMenu *GetBuildMenu() const OVERRIDE;
	virtual bool Deploy( void );
#endif

	virtual bool			CanBeSelected( void ) OVERRIDE;
	virtual bool			VisibleInWeaponSelection( void ) OVERRIDE;

	virtual void			ItemPreFrame( void );					// called each frame by the player PreThink
	virtual void			ItemBusyFrame( void );					// called each frame by the player PostThink
	virtual void			ItemHolsterFrame( void );			// called each frame by the player PreThink, if the weapon is holstered

	void	CheckDisguiseTimer( void );
	void	ProcessDisguiseImpulse( void );
};

// ********************************************************************************************
// PDA Expansion Slots
class CTFWeaponPDAExpansion_Dispenser : public CTFWearable
{
	DECLARE_CLASS( CTFWeaponPDAExpansion_Dispenser, CTFWearable );

public:
	DECLARE_NETWORKCLASS();
	DECLARE_DATADESC();

	virtual void		Equip( CBasePlayer *pOwner );
	virtual void		UnEquip( CBasePlayer *pOwner );
};

class CTFWeaponPDAExpansion_Teleporter : public CTFWearable
{
	DECLARE_CLASS( CTFWeaponPDAExpansion_Teleporter, CTFWearable );

public:
	DECLARE_NETWORKCLASS();
	DECLARE_DATADESC();

	virtual void		Equip( CBasePlayer *pOwner );
	virtual void		UnEquip( CBasePlayer *pOwner );
};

#ifdef STAGING_ONLY
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
class CTFWeaponPDA_Spy_Build : public CTFWeaponPDA
{
public:
	DECLARE_CLASS( CTFWeaponPDA_Spy_Build, CTFWeaponPDA );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual bool CanDeploy( void ) OVERRIDE;
	virtual const char *GetPanelName() { return ""; }
	virtual int	GetWeaponID( void ) const { return TF_WEAPON_PDA_SPY_BUILD; }
	virtual bool VisibleInWeaponSelection( void ) OVERRIDE;
#ifdef CLIENT_DLL
	virtual CHudBaseBuildMenu *GetBuildMenu() const OVERRIDE;
#endif

	float GetProgress( void );
	int	GetCount( void );
	const char*	GetEffectLabelText( void ) { return "#TF_Traps"; }
};
#endif

#endif // TF_WEAPON_PDA_H