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

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

#include "GameEventListener.h"
#include "tf_weapon_jar.h"
#include "tf_weapon_throwable.h"
#include "tf_shareddefs.h"
#include "tf_viewmodel.h"
#include "econ_item_view.h"

#ifdef CLIENT_DLL
	#include <vgui_controls/EditablePanel.h>
	#include "hudelement.h"
	#include "econ_controls.h"
	#include "c_tf_projectile_rocket.h"
	#include "econ_notifications.h"
	#include "vgui_controls/ImagePanel.h"

	#define CTFSpellBook							C_TFSpellBook
	#define CTFProjectile_SpellFireball				C_TFProjectile_SpellFireball
	#define CTFProjectile_SpellBats					C_TFProjectile_SpellBats
	#define CTFProjectile_SpellSpawnZombie			C_TFProjectile_SpellSpawnZombie
	#define CTFProjectile_SpellSpawnHorde			C_TFProjectile_SpellSpawnHorde
	#define CTFProjectile_SpellMirv					C_TFProjectile_SpellMirv
	#define CTFProjectile_SpellPumpkin				C_TFProjectile_SpellPumpkin

	#define CTFProjectile_SpellSpawnBoss			C_TFProjectile_SpellSpawnBoss
	#define CTFProjectile_SpellMeteorShower			C_TFProjectile_SpellMeteorShower
	#define CTFProjectile_SpellTransposeTeleport	C_TFProjectile_SpellTransposeTeleport
	#define CTFProjectile_SpellLightningOrb			C_TFProjectile_SpellLightningOrb
	#define CTFProjectile_SpellVortex				C_TFProjectile_SpellVortex
	
	#define CTFProjectile_SpellKartOrb				C_TFProjectile_SpellKartOrb
	#define CTFProjectile_SpellKartBats				C_TFProjectile_SpellKartBats
	#define CTFProjectile_SpellKartMirv				C_TFProjectile_SpellKartMirv
	#define CTFProjectile_SpellKartPumpkin			C_TFProjectile_SpellKartPumpkin
#else
	#include "tf_projectile_rocket.h"
#endif

#ifdef CLIENT_DLL

// For testing, hijack this basic menu but replace it later with TF specific UI
class CHudSpellMenu : public CHudElement, public vgui::EditablePanel
{
	DECLARE_CLASS_SIMPLE( CHudSpellMenu, EditablePanel );
public:
	CHudSpellMenu( const char *pElementName );
	virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
	virtual bool ShouldDraw( void );
	virtual void FireGameEvent( IGameEvent *event ) OVERRIDE;
	virtual void OnTick( void ) OVERRIDE;

	void UpdateSpellText( int iSpellIndex, int iCharges );

private:
	vgui::ImagePanel	*m_pSpellIcon;
	CExLabel			*m_pKeyBinding;

	int		m_iPrevSelectedSpell;
	float	m_iNextRollTime;
	float	m_flRollTickGap;
	bool	m_bTickSoundA;

	bool	m_bKillstreakMeterDrawing;
};

//=============================================================================
class CEquipSpellbookNotification : public CEconNotification
{
public:
	CEquipSpellbookNotification() : CEconNotification()
	{
		m_bHasTriggered = false;
	}

	~CEquipSpellbookNotification()
	{
		if ( !m_bHasTriggered )
		{
			m_bHasTriggered = true;
		}
	}

	virtual void MarkForDeletion()
	{
		m_bHasTriggered = true;
		CEconNotification::MarkForDeletion();
	}

	virtual EType NotificationType() { return eType_AcceptDecline; }
	virtual bool BShowInGameElements() const { return true; }

	virtual void Accept();
	virtual void Trigger() { Accept(); }
	virtual void Decline() { MarkForDeletion(); }
	virtual void UpdateTick();

	static bool IsNotificationType( CEconNotification *pNotification ) { return dynamic_cast< CEquipSpellbookNotification *>( pNotification ) != NULL; }

private:
	bool m_bHasTriggered;
};
#endif // CLIENT_DLL

#ifdef GAME_DLL
void RemoveAll2013HalloweenTeleportSpellsInMidFlight( void );
#endif

//=============================================================================
//
// CTFSpellBook class.
//
class CTFSpellBook : public CTFThrowable
{
public:
	DECLARE_CLASS( CTFSpellBook, CTFThrowable );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	CTFSpellBook();
	virtual int			GetWeaponID( void ) const			{ return TF_WEAPON_SPELLBOOK; }
	virtual const char*	GetEffectLabelText( void )			{ return "#TF_KART"; }
	virtual void		Precache( void );
	
	virtual void		PrimaryAttack();
	virtual void		ItemPostFrame( void );

	virtual void		ItemBusyFrame( void );		
	virtual void		ItemHolsterFrame( void );

	virtual bool		ShowHudElement ()								{ return false; }
	virtual bool		VisibleInWeaponSelection( void )				{ return false; }
	virtual bool		CanBeSelected( void )							{ return false; }

	bool				HasASpellWithCharges();

	virtual CBaseEntity *FireJar( CTFPlayer *pPlayer ) OVERRIDE;

	bool			CanCastSpell( CTFPlayer *pPlayer );
	void			PaySpellCost( CTFPlayer *pPlayer );
	void			ClearSpell();

	// Hack for infinite ammo
	virtual bool	IsEnergyWeapon( void ) const		{ return true; }
	float			Energy_GetMaxEnergy( void ) const	{ return 500; }
	float			Energy_GetEnergy( void ) const		{ return 500; }
	bool			Energy_FullyCharged( void ) const	{ return true; }
	bool			Energy_HasEnergy( void )			{ return true; }



#ifdef GAME_DLL
	void			SaveLastWeapon( CBaseCombatWeapon *pWpn ) { m_pStoredLastWpn = pWpn; }

	// Projectile Creation
	virtual void	TossJarThink( void );
	virtual void	CreateSpellRocket( const Vector &position, const QAngle &angles, const Vector &velocity, 
		const AngularImpulse &angVelocity, CBaseCombatCharacter *pOwner, const CTFWeaponInfo &weaponInfo );
	virtual void	CreateSpellJar( const Vector &position, const QAngle &angles, const Vector &velocity, 
		const AngularImpulse &angVelocity, CBaseCombatCharacter *pOwner, const CTFWeaponInfo &weaponInfo );

	// Spell Helpers
	// Think
	void			RollNewSpell( int iTier, bool bForceReroll = false );
	void			SetSelectedSpell( int index );
	void			SpeakSpellConceptIfAllowed();
	
	// Spells
	void			CastKartSpell();
	bool			CastSpell( CTFPlayer *pPlayer, int iSpellIndex );

	CHandle<CBaseCombatWeapon> m_pStoredLastWpn;

	void	RollNewSpellFinish( void );
	int		m_iNextSpell;
	int		m_iPreviouslyCastSpell;

#endif

	virtual bool CanThrowUnderWater( void ){ return true; }

#ifdef CLIENT_DLL
	float			m_flTimeNextErrorSound;
	EHANDLE			m_hHandEffectWeapon;
	HPARTICLEFFECT	m_hHandEffect;

#endif // CLIENT_DLL

	// Self Cast Spells
	static bool		CastSelfHeal( CTFPlayer *pPlayer );
	static bool		CastRocketJump( CTFPlayer *pPlayer );
	static bool		CastSelfSpeedBoost( CTFPlayer *pPlayer );
	static bool		CastSelfStealth( CTFPlayer *pPlayer );
	
	static bool		CastKartRocketJump( CTFPlayer *pPlayer );
	static bool		CastKartUber( CTFPlayer *pPlayer );
	static bool		CastKartBombHead( CTFPlayer *pPlayer );

	static const char* GetHandEffect( CEconItemView *pItem, int iTier );

	CNetworkVar( float, m_flTimeNextSpell );
	CNetworkVar( int, m_iSelectedSpellIndex );
	CNetworkVar( int, m_iSpellCharges );

	CNetworkVar( bool, m_bFiredAttack );
};


#ifdef GAME_DLL
CBaseEntity* CreateSpellSpawnZombie( CBaseCombatCharacter *pCaster, const Vector& vSpawnPosition, int nSkeletonType );
#endif


#endif // TF_WEAPON_SPELLBOOK_H