
#include <iostream>
#include <fstream>
#include <exception>
#include <math.h>
#include <stdlib.h>
#include "Simulador_Mart.h"
#include "Interficie_Mart.h"

extern Simulador_Mart *simulador_mart;
extern Visualitzador_Mart *visor_mart;

void Thread_Simulador_Mart::execute()
{
   while(1) {
      relax(MILISEGONS_HORA_MARCIANA);
      simulador_mart -> set_hora_marcial((simulador_mart -> get_hora_marcial() + 1) % 24);
   }   
}

Simulador_Mart::~Simulador_Mart()
{
   delete mapa_mart;
}

int Simulador_Mart::inicialitzar_mapa_mart(char *nom_fitxer)
{
   int correcte = 0;
   char nom_fitxer_actual[80];
   int num_fitxers = 0;
   try {
      std::ifstream fitxer_ini(nom_fitxer,std::ios::in);
      //std::ifstream fitxer_dades(nom_fitxer_actual,std::ios::in);
      for (int i = 0; i < 3; i++) {
         char linea[80];
         fitxer_ini >> linea;
         std::cout << "Linea: " << linea << "\n";
      }
/*      fitxer_ini >> num_files_mapa;
      fitxer_ini >> num_columnes_mapa;
      mapa_mart = (Parcela_Mart **)malloc(num_files_mapa * sizeof(Parcela_Mart *));
      for (int i = 0; i < num_files_mapa; i++) {
         mapa_mart[i] = (Parcela_Mart *)malloc(num_columnes_mapa * sizeof(Parcela_Mart));
      }
      while((num_fitxers < NUM_FITXERS_MAPES)) {
         fitxer_ini >> nom_fitxer_actual;
         std::ifstream fitxer_dades(nom_fitxer_actual,std::ios::in);      
         int x = 0, y = 0;
         char str_dada[80];
         double dada;
         fitxer_dades >> str_dada;
         while (!fitxer_dades.eof()) {
            dada = atof(str_dada);
            printf("%f\n",(float)dada);
            switch(num_fitxers) {
               case 0:  // Altura
                  mapa_mart[x][y].set_altura(dada * (float)FACTOR_ESCALA_ALTURA);
                  break; // (Sense factor escala altura)
               case 1:  // Temperatura
                  mapa_mart[x][y].set_temperatura(dada);                      
                  break;
               case 2:  // Material
                  mapa_mart[x][y].set_material((int)(dada * (float)FACTOR_ESCALA_MATERIAL));
                  break;
               case 3:  // %Ferro
                  mapa_mart[x][y].set_ferro(dada * (float)FACTOR_ESCALA_FERRO);
                  break;
               case 4:  // Llum
                  mapa_mart[x][y].set_llum(dada);
                  break;
               case 5:  // %Xray 
                  mapa_mart[x][y].set_xray(dada * (float)FACTOR_ESCALA_XRAY);
                  break;
            }
            if (y == (num_columnes_mapa - 1)) {
               x = x + 1;
            }   
            y = (y + 1) % num_columnes_mapa;
            fitxer_dades >> str_dada;
         }  
         fitxer_dades.close();
         num_fitxers++;
      }*/
      fitxer_ini >> num_files_mapa;
      fitxer_ini >> num_columnes_mapa;
      mapa_mart = (Parcela_Mart **)malloc(num_files_mapa * sizeof(Parcela_Mart *));
      for (int i = 0; i < num_files_mapa; i++) {
         mapa_mart[i] = (Parcela_Mart *)malloc(num_columnes_mapa * sizeof(Parcela_Mart));
      }
      while((num_fitxers < NUM_FITXERS_MAPES)) {
         fitxer_ini >> nom_fitxer_actual;
         std::ifstream fitxer_dades(nom_fitxer_actual,std::ios::in);
         int x = 0, y = 0;
         float dada;
         fitxer_dades >> dada;
         int comptador = 0;
         while (!fitxer_dades.eof()) {
            //std::cout << "Dada: " << dada << ", comptador: " << comptador << "\n";
            comptador++;
            switch(num_fitxers) {
               case 0:  // Altura
                  mapa_mart[x][y].set_altura((float)(dada * FACTOR_ESCALA_ALTURA));
                  break; // (Sense factor escala altura)
               case 1:  // Temperatura
                  mapa_mart[x][y].set_temperatura(dada);                      
                  break;
               case 2:  // Material
                  mapa_mart[x][y].set_material((int)(dada * FACTOR_ESCALA_MATERIAL));
                  break;
               case 3:  // %Ferro
                  mapa_mart[x][y].set_ferro((int)(dada * FACTOR_ESCALA_FERRO));
                  break;
               case 4:  // Llum
                  mapa_mart[x][y].set_llum(dada);
                  break;
               case 5:  // %Xray 
                  mapa_mart[x][y].set_xray((int)(dada * FACTOR_ESCALA_XRAY));
                  break;
            }
            if (y == (num_columnes_mapa - 1)) {
               x = x + 1;
            }   
            y = (y + 1) % num_columnes_mapa;
            fitxer_dades >> dada;
         }
         std::cout << "Fitxer processat: " << num_fitxers << "\n";
         //system("pause");
         fitxer_dades.close();
         num_fitxers++;
      }
      fitxer_ini.close();
      return 0;
   }
   catch(std::exception e) {
      std::cout << e.what();
      return 1;
   }   
}

float Simulador_Mart::get_altura(int x, int y)
{
   return mapa_mart[x][y].get_altura();
}

int Simulador_Mart::get_material(int x, int y)
{
   return mapa_mart[x][y].get_material();   
}

float Simulador_Mart::get_ferro(int x, int y)
{
   return mapa_mart[x][y].get_ferro();
}   

// Retorna la temperatura actual calculada en funcio
// de l'hora del dia i en funcio dels valors aleatoris de la posicio actual.
// Suposem: * Dia: entre -10ºC i + 50ºC
//          * Nit: entre -50ºC i + 10ºC
int Simulador_Mart::get_temperatura(int x, int y)
{
   float valor_temperatura = mapa_mart[x][y].get_temperatura();
   if (esDeDia()) {
       return (-10 + int(valor_temperatura * 60));
   }
   else {
       return (-50 + int(valor_temperatura * 60));
   }
}

// Retorna la llum actual calculada en funcio
// de l'hora del dia i en funcio dels valors aleatoris de la posicio actual.
float Simulador_Mart::get_llum(int x, int y)
{
   float valor_llum = mapa_mart[x][y].get_llum();
   if (esDeDia()) {
       return int(valor_llum * 50) + 50;
   }
   else {
       return int(valor_llum * 50);
   }
}   

float Simulador_Mart::get_xray(int x, int y)
{
   return mapa_mart[x][y].get_xray();
}   

void Simulador_Mart::set_hora_marcial(int hora_actual)
{
   hora_mart = hora_actual;
}

int Simulador_Mart::get_hora_marcial()
{
   return hora_mart;
}

int Simulador_Mart::get_num_columnes_mapa()
{
   return num_columnes_mapa;
}

int Simulador_Mart::get_num_files_mapa()
{
   return num_files_mapa;
}   

void Simulador_Mart::get_parcela(int x, int y,Parcela_Mart *parcela)
{
    parcela = &mapa_mart[x][y];
}

int Simulador_Mart::esDeDia()
{
    if (hora_mart > 8 && hora_mart < 20) {
        return 1;
    }
    else {
        return 0;
    }    
}    


