#include "Syslog.h"

#include "../../Cluster.hh"
#include "TimeSerie.hh"

DeclareClassifier<TimeSerie> serie_declare("serie");

TimeSerie::TimeSerie(ArgList const &args)
  :AbstractClassifier(args), m_counter(0), m_cur_pos(0), m_len(0) {
  Argument const &seq = args.get("serie");
  size_t len = seq.length();

  if( len%2!=0 ) 
    Syslog::write("Cluster:TimeSerie : serie argument number is odd ignoring last argument.");
  len /= 2;
  for( int i=0; i<len; ++i ) {
    size_t n_count = strtod(seq[2*i].c_str(), (char **)NULL);
    n_count = (1000*n_count)/CLUSTER_PERIOD; // I compute an approximate of the value based on process frequency
    if( n_count==0 )
      Syslog::write("Cluster:TimeSerie : one argument as to be repeated 0 seconds : I igore it.");
    else {
      size_t m_val = strtod(seq[2*i+1].c_str(), (char **)NULL);
      m_serie.push_back(n_count); 
      m_serie.push_back(m_val);
      ++m_len;
    }
  }
  if( 0==m_len )
    Syslog::write("Cluster:TimeSerie : no serie to play : I'll return 0");  
}

bool TimeSerie::classify(AbstractClassifier::cluster_type &winner,
			 AbstractClassifier::dist_type &distance) {
  distance = 0.0;
  if( m_len==0 ) {
    winner = 0;
    return false;
  } else {
    size_t n_iter = m_serie[2*m_cur_pos];
    if( m_counter>=n_iter ) {
      m_counter = 0;
      ++m_cur_pos;
      if( m_cur_pos==m_len )
	m_cur_pos = 0;
    }
    winner = m_serie[1+2*m_cur_pos];
    ++m_counter;
    return true;
  } 
}
