#include "PacketFactory.h"
#include <stdlib.h>
#include <time.h>

// inizializzazione dei membri statici
int PacketFactory:: countnum_ = 0;
PacketFactory* PacketFactory:: pfinstance_ = 0;
PacketFactory* PacketFactory:: instance()
{
   if (pfinstance_ == 0) // prima chiamata
   {
      pfinstance_ = new PacketFactory(); //crea l'unica istanza
   }

   pfinstance_->add("unreachable");

   return pfinstance_; //indirizzo dell'unica istanza
}

PacketFactory:: PacketFactory()
{
}

void PacketFactory:: add(const Address& addr)
{
   addr_vect_.push_back( addr );
}

Packet* PacketFactory:: create(const Address& addr)
{
   Address originator  = addr;
   Address destination;
   Info info = countnum_++;
   int j;
   int size = addr_vect_.size();

   //cout << "PF--> vect size: " << size << endl;
   //scelta pseudocasuale dell'indirizzo di destinazione
   srand48( long( time( 0 ) + countnum_ ) );
   j =  int( lrand48() );
   //cout << "j----> " << j << endl;

   
   /* se l'indirizzo di destinazione risulta
    * uguale a quello di origine, allora
    * si sceglie il prossimo nodo, in modo
    * circolare. ( nell'else )
    */
    
   if ( addr_vect_[ (j % size) ] != originator )
   {
      //cout << "PF--> indirizzo diverso" << endl;
      destination = addr_vect_[ (j % size) ];
   }
   else
   {
      //cout << "PF--> indirizzo uguale" << endl;
      destination = addr_vect_[ ( (j+1) % size) ];
   }
   
   //cout << "---> destinazione --> " << destination << endl; 
   //cout << "debug prima di creare" << endl;
   Packet* packet = new Packet( originator, destination, info );
   //cout << "debug dopo aver creato" << endl;
   
   return packet;
}