#include <enviro.h>
#include <iostream>
//#include <time.h>
//#include <stdio.h>

using namespace std;

enviro::enviro(MainWindow *parent) {

  print("Setting up enviro monitoring window\n");

  //The window layout
  QGridLayout *mylayout = new QGridLayout();
  mylayout->setColumnMinimumWidth(1, 200);
  mylayout->setColumnMinimumWidth(2, 90);
  mylayout->setColumnMinimumWidth(3, 80);
  mylayout->setColumnMinimumWidth(4, 80);
  mylayout->setColumnMinimumWidth(5, 80);
  mylayout->setColumnMinimumWidth(6, 80);
  mylayout->setColumnMinimumWidth(7, 80);

  EnvparsLabel[0] = new QLabel(tr("Date(env)"));
  EnvparsLabel[1] = new QLabel(tr("Time(env)"));
  EnvparsLabel[2] = new QLabel(tr("P<sub>0</sub>(env)"));
  EnvparsLabel[3] = new QLabel(tr("T<sub>0</sub>(env)"));
  EnvparsLabel[4] = new QLabel(tr("H<sub>0</sub>(env)"));
  EnvparsLabel[5] = new QLabel(tr("T<sub>1</sub>(env)"));
  EnvparsLabel[6] = new QLabel(tr("H<sub>1</sub>(env)"));
  EnvparsLabel[7] = new QLabel(tr("Date(gas)"));
  EnvparsLabel[8] = new QLabel(tr("Time(gas)"));
  EnvparsLabel[9] = new QLabel(tr("P<sub>chambers</sub>(gas)"));
  EnvparsLabel[10] = new QLabel(tr("T(gas)"));
  EnvparsLabel[11] = new QLabel(tr("H(gas)"));
			       
  for ( unsigned int i = 0; i < NEnvpars; i++ ) {
    EnvparsLabel[i]->setAlignment( Qt::AlignCenter );
    EnvparsLine[i] = new QLineEdit;
    EnvparsLine[i]->setReadOnly(true);
    EnvparsLine[i]->setStyleSheet( "color:black; background-color:lightGray" );
    EnvparsLine[i]->setAlignment( Qt::AlignCenter );
    if ( i < 7 ) {
      mylayout->addWidget(EnvparsLabel[i], 0, i+1);
      mylayout->addWidget(EnvparsLine[i], 1, i+1);
    } else {
      mylayout->addWidget(EnvparsLabel[i], 2, i-6);
      mylayout->addWidget(EnvparsLine[i], 3, i-6);
    }
  }

  this->setLayout(mylayout);
  this->resize(550,50);
  this->setWindowTitle("Environmental/Gas Parameters");

  connect(this, SIGNAL(consolewrite(const QString)), parent,
	  SLOT(printc(const QString)));

  p0_env_min = -1.;
  p0_env_max = -1.;

  updateWindow();

  //Timer which calls the update function
  updateTimer = new QTimer(this);
  connect( updateTimer, SIGNAL(timeout()), this, SLOT(updateWindow()));
  updateTimer->start(UPDATE_TIME_enviro);

}

//--------------------------------------------------------------------------

void enviro::FetchEnviropars() {  

  char dummy[80];

  t_gas = -1.; h_gas = -1.; p_gas = -1.;
  p0_env = -1.; t0_env = -1.; h0_env = -1.; t1_env = -1.; h1_env = -1.;

  //pipe wget output to a file handle
  FILE *fp = popen("wget --quiet -O - http://rndlab4.ugent.be/RPClab/rpcgaspars.py","r"); 
  if ( fp == NULL ) return;

  for ( unsigned int i = 0; i < 7; i++ ) 
    fgets( dummy, 80, fp);
  fgets( date_gas, 80, fp);
  fgets( dummy, 80, fp);
  fgets( time_gas, 80, fp);
  fgets( dummy, 80, fp);
  fgets( dummy, 80, fp);
  fscanf( fp, "%f %f %f\n", &t_gas, &h_gas, &p_gas );
  
  for (unsigned int i = 0; i < 3; i++ ) 
    fgets( dummy, 80, fp);
  fgets( date_env, 80, fp);
  fgets( dummy, 80, fp);
  fgets( time_env, 80, fp);  
  fgets( dummy, 80, fp);
  fgets( dummy, 80, fp);
  fscanf( fp, "%f %f %f %f %f", &p0_env, &t0_env, &h0_env, &t1_env, &h1_env );  

  /*
  time_t rawtime;
  struct tm *timeinfo;
  time( &rawtime );
  timeinfo = localtime( &rawtime );
  printf ( "Current local time and date: %s", asctime(timeinfo) );
  */

  pclose(fp); //close pipe

}

//-------------------------------------------------------------------------

void enviro::updateWindow() {

  QMutexLocker locker(&mutex);

  FetchEnviropars();

  // check range of values
  if ( (p0_env < 500.) || (p0_env > 1500.) ) {
    printc("Enviro parameters out of range, using default values\n");
    p0_env = Pdef;
    t0_env = Tdef;
    h0_env = Hdef;
    t1_env = Tdef;
    h1_env = Hdef;
    t_gas = Tdef;
    h_gas = Hdef;
    p_gas = 0.;
  } else {
    // keep track of p0 min/max values
    if ( p0_env_min == -1. || p0_env < p0_env_min ) p0_env_min = p0_env;
    if ( p0_env_max == -1. || p0_env > p0_env_max ) p0_env_max = p0_env;
  }

  EnvparsLine[0]->setText(QString(date_env));
  EnvparsLine[1]->setText(QString(time_env));
  EnvparsLine[2]->setText(QString::number(p0_env).append(" mbar"));
  EnvparsLine[3]->setText(QString::number(t0_env).append(" deg"));
  EnvparsLine[4]->setText(QString::number(h0_env).append(" %"));
  EnvparsLine[5]->setText(QString::number(t1_env).append(" deg"));
  EnvparsLine[6]->setText(QString::number(h1_env).append(" %"));

  EnvparsLine[7]->setText(QString(date_gas));
  EnvparsLine[8]->setText(QString(time_gas));
  EnvparsLine[9]->setText(QString::number(p_gas).append(" mbar"));
  EnvparsLine[10]->setText(QString::number(t_gas).append(" deg"));
  EnvparsLine[11]->setText(QString::number(h_gas).append(" %"));

}

//-------------------------------------------------------------------------

void enviro::printc(const char* format, ...)
{
  QString premessage, message;
  premessage.sprintf("Enviro:\t");
  va_list args;
  va_start(args, format);
  message.vsprintf(format, args);
  va_end(args);
  
  emit consolewrite(premessage+message);
}

//-------------------------------------------------------------------------

void enviro::print(const char* format, ...)
{
  va_list args;
  va_start(args, format);
  printf("Enviro:\t");
  vprintf(format, args);
  va_end(args);
}

//-------------------------------------------------------------------------

enviro::~enviro() {}
