#ifndef AIBOINFOPKG_H_DEF
#define AIBOINFOPKG_H_DEF

#include "TelepatiPkg.h"

using namespace std;
/**@file
*/
/**Stati degli Aibo.*/
enum aiboState{
  ACTIVE=0, /**<Aibo attivo*/
  WAITINGREPLY=1, /**<Aibo non ha ancora mandato un HyReply.*/
  INACTIVE=2, /**<Aibo inattivo.*/
  BYED=3 /**<Aibo ha mandato un Bye message.*/
};

/** Implementa un messaggio di informazioni sulla AiboNet.  Fornisce
    informazioni sul numero di Aibo presenti e sul loro stato (attivi
    o non attivi).@n Struttura di "pkg data":@n byte: numero degli
    aibo con cui e' possibile comunicare. Gli indirizzi degli aibo a
    cui mandare i messaggi saranno basati su questo numero.@n byte[]:
    array di byte (conetenente aiboState) di dimensioni numOfAibo,
    contenente lo stato di attivita' dei singoli Aibo.
*/
class AiboInfoPkg : public TelepatiPkg {
 public:
  /** Costruttore di default*/
  AiboInfoPkg();
  /** Costruttore ordinario. @param aiboAct array di aiboState
      contenente lo stato di attivita' degli aibo @param aiboNum
      numero di Aibo presenti in rete @param a aibo di destinazione
      (per compatibilita') */
  AiboInfoPkg(aiboState* aiboAct, int aiboNum=0, int a=TelepatiPkg::ADDR_INVALID);
  /**Costruisce l'oggetto a partire dall'array restituito da
     getMsg(). @param ptr puntatore all'array di byte. @see getMsg()*/
  AiboInfoPkg(byte* ptr);

  /** Distruttore di default*/
  virtual ~AiboInfoPkg();

  /** Clonatore. Restituisce un clone dell'oggetto su cui e'
      chiamato.*/
  virtual TelepatiPkg* clone();

  /** Ritorna un array che rappresenta l'oggetto. Costruisce un array
      che rappresenta l'oggetto, l'array corrisponde ai dati spediti
      via rete. @return array di byte. @see AiboInfoPkg(byte* ptr)*/
  byte* getMsg();  

  /** numero di aibo presenti in rete. @return numero di aibo */
  inline int getNumOfAibo() { return numOfAibo; };
  /** Informazioni sullo stato di attivita' di un Aibo. @param a aibo
      di cui si vuole conscere lo stato. @return true: se l'aibo e'
      attivo; false: altrimenti*/
  inline bool isActive(int a){  
    if(a < numOfAibo)
      return (aiboActive[a] == ACTIVE || aiboActive[a] == WAITINGREPLY) ? true: false;
    else
      return false;
  };

  /** Informazioni sullo stato di attivita' degli Aibo. Da
      informazioni sullo stato di attivita' di tutti gli Aibo. @return
      true se tutti gli aibo sono attivi, false altrimenti*/
  bool isAllActive();

 private:
  int numOfAibo; /* numero di Aibo presenti*/
  aiboState *aiboActive; /* array degli stati di attivita' degli Aibo*/
};
#endif
