#include "SSDLogger.hh"
#include "SmartSamplerData.hh"
#include "ssdbg.hh"

/*
 * class SSDLogger
 */

// structors :

SSDLogger::SSDLogger(SmartSamplerData *ssdIn)
  :ssd(ssdIn),DataLogWriter(SSDLogName, DataLog::BinaryFormat, AutoTimeStamp),
   _logtemperature(NULL),
   _logconductivity(NULL),
   _logsalinity(NULL),
   _logoxygen(NULL),
   _logbbshort(NULL),
   _logbblong(NULL),
   _logfluor(NULL),
   _lognitrate(NULL),
   _logdepth(NULL){
  ssdbg(DBG_LOAD)("creating SSDLogger\n");
}

SSDLogger::~SSDLogger() {
  ShortData *tmp;
  ssdbg(DBG_CLEAN)("destroying SSDLogger\n");
  while(_logclusters.size()){
    tmp = _logclusters.back();
    _logclusters.pop_back();
    delete(tmp);
  }
  if(NULL != _logtemperature)delete _logtemperature;
  if(NULL != _logconductivity)delete _logconductivity;
  if(NULL != _logsalinity)delete _logsalinity;
  if(NULL != _logoxygen)delete _logoxygen;
  if(NULL != _logbbshort)delete _logbbshort;
  if(NULL != _logbblong)delete _logbblong;
  if(NULL != _logfluor)delete _logfluor;
  if(NULL != _lognitrate)delete _lognitrate;
  if(NULL != _logdepth)delete _logdepth;
}

void SSDLogger::initializeData(){
  SmartSamplerData::ssici_t ci;
  ShortData *dp;
  
  setMnemonic(SSDLogName);
  for(ci=ssd->clusters.begin();ci!=ssd->clusters.end();ci++){
    dp = new ShortData((*ci).classifier);
    addField(dp);
    _logclusters.push_back(dp);
  }
  if(ssd->temperature.track)addField(_logtemperature =  new FloatData("temperature"));
  if(ssd->conductivity.track)addField(_logconductivity =  new FloatData("conductivity"));
  if(ssd->salinity.track)addField(_logsalinity =  new FloatData("salinity"));
  if(ssd->oxygen.track)addField(_logoxygen =  new FloatData("oxygen"));
  if(ssd->bbshort.track)addField(_logbbshort =  new DoubleData("bbshort"));
  if(ssd->bblong.track)addField(_logbblong =  new DoubleData("bblong"));
  if(ssd->fluor.track)addField(_logfluor =  new DoubleData("fluor"));
  if(ssd->nitrate.track)addField(_lognitrate =  new DoubleData("nitrate"));
  if(ssd->depth.track)addField(_logdepth =  new DoubleData("depth"));
}

void SSDLogger::setFields()
{
  int i;
  ShortData *dp;

  if(!ssd->anyNew())
    return;

  for(i=0;i<_logclusters.size();i++){
    ssdbg(DBG_LOG)("SSDLogger -- Setting cluster number %d best value %d.\n",i,ssd->clusters[i].best);
    _logclusters[i]->setValue(ssd->clusters[i].best);
  }

  if(ssd->temperature.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting temperature value to %.4f.\n",ssd->temperature.val);
    _logtemperature->setValue(ssd->temperature.val);
  }
  if(ssd->conductivity.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting conductivity value to %.4f.\n",ssd->conductivity.val);
    _logconductivity->setValue(ssd->conductivity.val);
  }
  if(ssd->salinity.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting salinity value to %.4f.\n",ssd->salinity.val);
    _logsalinity->setValue(ssd->salinity.val);
  }
  if(ssd->oxygen.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting oxygen value to %.4f.\n",ssd->oxygen.val);
    _logoxygen->setValue(ssd->oxygen.val);
  }
  if(ssd->bbshort.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting bbshort value to %.4f.\n",ssd->bbshort.val);
    _logbbshort->setValue(ssd->bbshort.val);
  }
  if(ssd->bblong.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting bblong value to %.4f.\n",ssd->bblong.val);
    _logbblong->setValue(ssd->bblong.val);
  }
  if(ssd->fluor.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting fluor value to %.4f.\n",ssd->fluor.val);
    _logfluor->setValue(ssd->fluor.val);
  }
  if(ssd->nitrate.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting nitrate value to %.4f.\n",ssd->nitrate.val);
    _lognitrate->setValue(ssd->nitrate.val);
  }
  if(ssd->depth.track){
    ssdbg(DBG_LOG)("SSDLogger -- Setting depth value to %.4f.\n",ssd->depth.val);
    _logdepth->setValue(ssd->depth.val);
  }
}

void SSDLogger::callWrite(){
  if(ssd->anyNew()){
    ssdbg(DBG_LOG)("SSDLogger -- Writing data to log.");
    write();
  }else{
    ssdbg(DBG_LOG)("SSDLogger -- No new data, skip write.");
  }
}
