#include "ClusterLogger.hh"

/*
 * class ClusterLogger::Entry
 */

ClusterLogger::Entry::Entry(AbstractClassifier const &classif,
			    DataLogWriter &out,
			    Entry *nxt)
  :m_cls(classif), m_best((classif.getId()+"_cls").c_str()),
   m_dist((classif.getId()+"_dist").c_str()), m_next(nxt) {
  m_best.setLongName(("Best cluster from "+classif.getId()).c_str());
  m_best.setUnits("Cluster Id");
  out.addField(&m_best);
  m_dist.setLongName(("Distance to cluster from "+classif.getId()).c_str());
  m_dist.setUnits("UNITLESS");
  out.addField(&m_dist);

  Syslog::write("Cluster: classifier %s registered for logging.", classif.getId().c_str()); 
}

ClusterLogger::Entry::~Entry() {
  if( NULL!=m_next )
    delete m_next;
}

void ClusterLogger::Entry::update() {
#if 0
  Syslog::write("clusterlogger: updating entry %s.", m_cls.getId().c_str());

  Syslog::write("\twinner is %d with a distance of %f", 
		m_cls.lastWinner(), m_cls.lastDistance());
#endif // DEBUG
  m_best.setValue(m_cls.lastWinner());
  m_dist.setValue(m_cls.lastDistance());
  if( NULL!=m_next )
    m_next->update();
}

/*
 * class ClusterLogger
 */

// structors :

ClusterLogger::ClusterLogger(DataLog::FileFormat format)
  :DataLogWriter(ClusterLogName, format, AutoTimeStamp),
   m_entries(NULL) {
  setMnemonic(ClusterLogName);
}

ClusterLogger::~ClusterLogger() {
  if( NULL!=m_entries )
    delete m_entries;
}

// Modifiers :

void ClusterLogger::addClassifier(AbstractClassifier const &classifier) {
  m_entries = new Entry(classifier, *this, m_entries);
}

void ClusterLogger::setFields() {
  if( NULL!=m_entries )
    m_entries->update();
}
