#include "Syslog.h"

#include "Cluster.hh"

/*
 * class Cluster
 */

// structors :

Cluster::Cluster(int millisec)
  :PeriodicTask(ClusterName), m_log(DataLog::BinaryFormat) {
  Syslog::write("Cluster - main class created.");
  addPeriodicCallback(millisec, (CallbackMethod)Cluster::callback);
}

Cluster::~Cluster() {
  Syslog::write("Cluster - destroying the main class.");
  while( !m_classifiers.empty() ) {
    AbstractClassifier *tmp = m_classifiers.front();
    m_classifiers.pop_front();
    delete tmp;
  }
}

// Manipulators :

void Cluster::loadConfig(Symbol const &fileName) {
  Syslog::write("Cluster - loading %s", fileName.c_str()); 

  m_loader.load(fileName);

  m_loader.flushTo(m_classifiers);

  if( m_classifiers.empty() ) 
    Syslog::write("Cluster : warning : No cluster loaded !!!!!!!");
  else {
    std::list<AbstractClassifier *>::iterator i = m_classifiers.begin();
    std::list<AbstractClassifier *>::iterator const endi = m_classifiers.end();

    for( ; endi!=i; ++i )
      m_log.addClassifier(**i);
  }
}

void Cluster::callback() {
  if( !m_classifiers.empty() ) {
    m_devices->update(); // Getting data from devices
  
    std::list<AbstractClassifier *>::iterator i = m_classifiers.begin();
    std::list<AbstractClassifier *>::iterator const endi = m_classifiers.end();
    
    for( ; endi!=i; ++i )
      (*i)->classify(); // Classify 
    m_log.write();
  } 
#ifdef DEBUG
  else 
    Syslog::write("Cluster : no classifier loaded.");
#endif // DEBUG
}
