#include "Node.h"
#include <iostream>

Node::Node( const Address& address, PacketFactory* pf )
: node_address_( address ), pf_( pf ), suspended_for_( 0 )
{
   //cout << "Costruisco un nodo" << endl;
   pf_->add( node_address_ );
}

Node::~Node()
{
   //cout << "Distruggo un nodo" << endl;
}

const Address& Node::getAddress() const
{
   return node_address_;
}

bool Node::accept( const Packet& inpacket ) const
{
   if ( inpacket.isDestinated( node_address_ ) == true )
   {
      handle( inpacket );
      return true;
   }
   else
      return false ;    
}

Packet* Node::send()
{
   Packet* outpacket = NULL;
   
   //cout << "  debug:  sono in send()" << endl;
   if ( suspended_for_ == 0 )
   {
      outpacket = pf_->create( getAddress() );
      //cout << "Pacchetto pronto per la spedizione" << endl;
   }
   else
   {
      --suspended_for_;
      //decremento il contatore
      cout << getAddress() << " sospeso ancora per " << suspended_for_ << endl;
   }
  
   return outpacket;
}

void Node::suspend(const int time )
{
   if( suspended_for_ == 0)
   {
      suspended_for_ = time;
      cout << getAddress() << " e' stato sospeso per " 
           << suspended_for_ << " unita' di tempo" << endl;
   }
}

void Node::handle( const Packet& packet_to_handle ) const
{
   cout << "Pacchetto " << packet_to_handle.getInfo() 
        << " processato da " << getAddress() << ": Nodo"<< endl;
}