#include <iostream>
#include <steereoClientSteering.h>
#include <steereoSocketCommunicator.h>
#include <steerParameterClient.h>

#define DATASIZE 10

SteereoClientSteering* clientSteer;
double meanValue = 0;

void handleAnswer (request req)
{
  if (strcmp (req.steeringMethod, "meanValueCommand") == 0)
  {
    clientSteer->getCommunicator()->receiveDouble(clientSteer->getConnection()->getDataConnection(), &meanValue);
    std::cout << "meanValueCommand returns the value " <<  meanValue <<std::endl;
  }
}

int main (int argc, char** argv)
{
  clientSteer = new SteereoClientSteering;
  double* myDataArray = new double[DATASIZE];
  double myAttenuation;
  for (int i = 0; i < DATASIZE; i++)
  {
    myDataArray[i] = 0;
  }
  SteerParameterClient* paramClient = new SteerParameterClient();
  SteereoLogger::setOutputLevel(2);
  SteereoSocketCommunicator* clientComm = new SteereoSocketCommunicator;
  clientSteer->startConnection (clientComm, "127.0.0.1", "44445");
  paramClient->setClient (clientSteer);
  paramClient->addAction ();
  paramClient->registerScalarParameter ("attenuation", &myAttenuation);
  paramClient->registerArrayParameter ("dataArray", myDataArray, DATASIZE);
  clientSteer->addAction("meanValueCommand", &handleAnswer);

  clientSteer->startAccepting();
  std::string input = "\0";

  while (input != "q")
  {
    std::cout << "(c)hange attenuation, (g)et attenuation, get (d)ata array, get (m)ean value or (q)uit ? ";
    std::cin >> input;
    if (input == "c")
    {
      std::cout << "input new attenuation: ";
      std::cin >> myAttenuation;
      paramClient->requestSetParameter ("attenuation");
      while (!paramClient->isParameterUpdated ("attenuation")) {}
    } else if (input == "g")
    {
      paramClient->requestGetParameter ("attenuation");
      while (!paramClient->isParameterUpdated ("attenuation")) {}
      std::cout << "The current attenuation is " << myAttenuation << std::endl;
    } else if (input == "m")
    {
      int commandID;
      commandID = clientSteer->makeRequest ("meanValueCommand", "0 9");
      while (!clientSteer->hasBeenExecuted(commandID)) {}
      std::cout << "The mean value is " << meanValue << std::endl;
    }
    else if (input == "d")
    {
      paramClient->requestGetParameter ("dataArray");
      while (!paramClient->isParameterUpdated ("dataArray")) {}
      std::cout << "The current data array is: ";
      for (int i = 0; i < DATASIZE; i++)
      {
        std::cout << myDataArray[i] << ", ";
      }
      std::cout << std::endl;
    }
  }
  clientSteer->closeConnections ();
  return 0;
}