#ifndef NETWORKLIB_ROUTER_H
#define NETWORKLIB_ROUTER_H

#define MAX_CONNECTIONS_PER_ROUTER 128

class Connection;

class RouterExtraData : public NetworkObject {
public:
	RouterExtraData() {}
	virtual ~RouterExtraData() {}
};

class Router {
	public:
		Router();
		Router( const RouterPosition & );
		virtual ~Router();

		void SetPosition( const RouterPosition & );
		
		const RouterPosition & GetPosition() const { return position; }

		bool operator == ( const Router &) const;
		bool operator != ( const Router &) const;

		// routing function
		int GetCapacity() const;
		int GetLoad() const;
		bool IsFull() const { return GetLoad() == GetCapacity(); }
		bool SetPacketToRoute( Packet * ); // false if full
		Packet * GetNextPacketToRoute(); // 0 if none
		bool SendPacket( Packet * packet , Router & destination );
		void RemoveAllPackets();

		// connections 
		void AddConnection( Connection & connection );
		void RemoveConnection( Connection & connection );
		int GetConnectionNum() const;
		Connection & GetConnection( int index );
		Connection & GetConnection( Router & destination );

		// used by policy
		void SetExtraData( RouterExtraData * ); // will be destroy when router destroy
		RouterExtraData * GetExtraData() const { return extra_data;};

	private:
		RouterPosition position;	
		RouterExtraData * extra_data;
		
		typedef Connection * ConnectionPointer;
		ConnectionPointer connections[MAX_CONNECTIONS_PER_ROUTER];

		PacketsBuffer * packets_to_route;
};

#endif // NETWORKLIB_ROUTER_H