///////////////////////////////////////////////////////////
///////////////// Have an itch? Scratch it! ///////////////
///////////////////////// SCRATCH /////////////////////////
/////////////////////  A MUD  Server   ////////////////////
///////////////////// By: Jared Devall ////////////////////
/////////////////////      Thanks:     ////////////////////
/////////////////////  DIKU/Merc/ROM   ////////////////////
///////////////////// Aetas/Deus Gang  ////////////////////
/////////////////////       Beej       ////////////////////
///////////////////////////////////////////////////////////

#ifndef __AVATAR_H_
#define __AVATAR_H_

#include "socket.h"
#include "handler.h"
#include <deque>
#include <map>

enum STATUS { LOGIN, CONNECTED };
class Avatar {
	Socket *    _socket;
	std::string _name;
	std::map< std::string, std::string > _info;
	std::string _edit;
	bool        _gotInput;
	bool        _disconnected;
	STATUS      _status;
	// Private Handler Stuff
	void        PopHandler( void );
	
	public:	
	typedef std::deque<Handler *> handlerStack;
				 Avatar( );
				 ~Avatar( );
	STATUS       GetStatus( void );
	void         SetStatus ( STATUS );
	void         Send( char *, ... );
	void         Send( const std::string & );
	Socket *     GetSocket( void );
	void         SetSocket( Socket * );
	bool         SetName( const std::string & );
	bool         VerifyPassword( const std::string & );
	std::string  EncryptPassword( const std::string & );
	void         ClearPassword( void );
	std::string  Get( const std::string & );
	bool         Set( const std::string &, const std::string & );
	void         SetEdit( const std::string & );
	std::string  GetEdit( void );
	bool         HasPassword( void );
	void         FlushOutput( void );
	void         SetDisconnected( bool value );
	bool         IsDisconnected( void );
	void         SetGotInput( bool value );
	bool         GotInput( void );
	bool         Load( void );
	bool         Save( void );
	bool         Create( void );
	bool         Delete( void );
	// Public Handler Stuff
	void	     StackHandler( Handler *);
	void		 ReplaceHandler( Handler *);
	void		 ExitHandler( void );
	void		 HandleInput( const std::string & );
	handlerStack _handlers;
	
};
#endif