
#include <iostream>
#include <fstream>
#include <vector>
#include <XmlRpc.h>
#include "Comunicacio_Robot.h"
#include "Interficie_Mart.h"
#include "Client_Xmlrpc_Mart.h"
#include "Servidor_Xmlrpc_Mart.h"
#include "Tipus_Globals.h"

#define MILISEGONS_CLIENT_PING 10000

using namespace XmlRpc;

extern Comunicacio_Robot *interficie_robot;
extern Visualitzador_Mart *visor_mart;
extern std::vector<TInforme> informe_mart;

std::fstream *fitxer;

void Thread_Client_Mart::execute()
{
   XmlRpcClient client_mart(ip_terra,port_terra);
   XmlRpcValue resultat,argument;
   bool ok = false;
   int tasca_activa = interficie_robot -> get_Funcionament();

   std::cout << " *** CLIENT MART:" << tasca;

   while (tasca_activa) {
      if(tasca.compare("comprovar_comunicacio") == 0) {
         ok = client_mart.execute("comunicacio_activa", argument, resultat);
         if (ok) {
            relax(MILISEGONS_CLIENT_PING);
            tasca_activa = interficie_robot -> get_Funcionament();
         }
         else {
            emergencia = "El canal de comunicacio no esta actiu!";
            interficie_robot -> tractar_Emergencia(emergencia);
            visor_mart -> set_Missatge(emergencia);
            tasca_activa = interficie_robot -> get_Funcionament();            
         }   
      }
      else if(tasca.compare("informe_dades_robot") == 0) {
         relax(MILISEGONS_CLIENT_INFORME);
         XmlRpcValue arguments;

         // Consulta de les dades de l'informe
         int comptador = 0;
         std::vector<TInforme>::const_iterator itFills;

         for(itFills = informe_mart.begin(); itFills != informe_mart.end(); itFills++) {
            TInforme dada = *itFills;
            arguments[comptador] = (double)dada.posicio.x; comptador++;
            arguments[comptador] = (double)dada.posicio.y; comptador++;            
            arguments[comptador] = (double)dada.posicio.z; comptador++;
            arguments[comptador] = dada.posicio.angle_orientacio; comptador++;
            arguments[comptador] = dada.posicio.angle_horitzo; comptador++;
            arguments[comptador] = dada.bateria; comptador++;
            arguments[comptador] = (double)dada.ferro; comptador++;
            arguments[comptador] = (double)dada.llum; comptador++;
            arguments[comptador] = dada.material; comptador++;
            arguments[comptador] = (double)dada.temperatura; comptador++;
            arguments[comptador] = (double)dada.xray; comptador++;
         }
         int num_params = arguments.size();
         time_t temps_actual;         
         time(&temps_actual);

         std::ofstream fitxer("informe.txt",std::ios::app|std::ios::out);
         fitxer << "\n--Informe de Mart-- " << ctime(&temps_actual) << std::endl;
         fitxer << "| X | Y | Z | Angle_Orientacio | Angle_Altura | Bateria | " << 
                    "Ferro | Llum | Material | Temperatura | Xray |" << std::endl;
         // Obtenir tants registres com longitud del informe entre 
         // el numero de camps (x,y,z,temp,llum,material,hora,etc)
         // de cada registre de informe de mart, enviat periodicament
         for (int i = 0; i < num_params / 11; i++) {
            fitxer <<  "| ";
            for(int j = 0; j < 11; j++) {
               fitxer <<  arguments[(11 * i) + j] << " | ";
            }   
            fitxer <<  std::endl;
         }
         fitxer.close();

         // Es buida el vector de dades actuals de l'informe
         TInforme dada_buida;
         modificar_informe(dada_buida,1);
         std::cout << "\nENVIANT_INFORME.............................................\n";
         ok = client_mart.execute("informe_mart", arguments, resultat);
         if (ok) {
            tasca_activa = interficie_robot -> get_Funcionament();
         }
         else {
            emergencia = "El canal de comunicacio no esta actiu!";
            interficie_robot -> tractar_Emergencia(emergencia);
            visor_mart -> set_Missatge(emergencia);
            tasca_activa = interficie_robot -> get_Funcionament();
         }
      }   
      else if(tasca.compare("emergencia") == 0) {
         argument = emergencia;
         ok = client_mart.execute("parada_emergencia", argument, resultat);
         if (ok) {
            visor_mart -> set_Missatge(emergencia);
         }
         else {
            visor_mart -> set_Missatge("El canal de comunicacio no esta actiu!");
         }
      }
   }     

   fitxer->close();

}   

/*Thread_Client_Mart::Thread_Client_Mart(char *iptTerra, int portTerra, const std::string &feina)
   : thread(true), ip_terra(ipTerra), port_terra(portTerra), tasca(feina)
{
   // Constructor buit, que inicialitza les variables internes
}*/

Thread_Client_Mart::Thread_Client_Mart(char *ipTerra, int portTerra, const std::string &feina,
    char *alarma) : thread(true), ip_terra(ipTerra), port_terra(portTerra), tasca(feina), emergencia(alarma)
{
   // Constructor buit, que inicialitza les variables internes
   // Rep un missatge de emergencia que assigna inicialment
}   

