#include <SD.h>
#include "ArchivoSD.h"
#include "Sim808Manager.h"

#include "ReporteManager.h"

ReporteManager::ReporteManager(ArchivoConfig* archivoConfig, Sim808Manager* moduloSim)
{
  timerData = millis();
  timerInf = millis();
  timerGPRS = millis();
  conf = archivoConfig;
  sim = moduloSim;
  GPRSdata=SMSEnviados = false;
}



void ReporteManager::procesa()
{
  if (Utiles::isTime(&timerData, conf->TimerSMSData))
  {
    enviaData();
    enviaDataGPRS();
  }
  if (Utiles::isTime(&timerInf, conf->TimerSMSInfo))
  {
    enviaInfo();
  }
  if (Utiles::isTime(&timerInf, conf->TimerGPRS))
  {
      enviaDataGPRS();
  }
}

void ReporteManager::enviaData()
{
  DataGPSSimManager* coor = sim->GetUltGPS();

  //envia mensaje inicial------------------------------
  char buff[160];
  char strlat[16];
  char strlon[16];
  char strfecha[24];
  char stralt[16];
  char strpres[16];
  char strtem[16];
  char strtemInt[16];
  char strhdop[16];
  char strvdop[16];
  char precision[12];
  dtostrf(coor->lat, 4, 6, strlat);
  dtostrf(coor->lon, 4, 6, strlon);
  dtostrf(coor->altitude, 6, 1, stralt);
  dtostrf(Pres, 6, 1, strpres);
  dtostrf(TempExt, 6, 1, strtem);
  dtostrf(TempInt, 6, 1, strtemInt);
  dtostrf(coor->hdop, 2, 2, strhdop);
  dtostrf(coor->vdop, 2, 2, strvdop);
  sprintf(buff, "APPData;%s;%s;%s;%s; TempEx=%soC TempInt=%soC Prec=%s; Pres=%smBar; HDOP=%s; VDOP=%s ", coor->getFecha(strfecha), strlat, strlon, stralt, strtem, strtemInt, coor->getPrecision(precision), strpres, strhdop, strvdop  );
  Utiles::printCOM(buff);
  char* tlf;
  SMSEnviados = conf->GetLen()>0;
  for (int i = 0; i < conf->GetLen(); i++)
  {
    tlf = conf->GetTlfData(i);
    if (!tlf || !tlf[0])
      continue;
    if (!sim->EnviaSMS(tlf, buff))
    {
      Utiles::printCOM("Error al enviar sms data");
      SMSEnviados = false;
    }
  }
}

void ReporteManager::enviaInfo()
{
    DataGPSSimManager* coor = sim->GetUltGPS();

    //envia mensaje inicial------------------------------
    char buff[160];
    char strlat[16];
    char strlon[16];
    char strfecha[24];
    char stralt[16];
    char strhdop[16];
    char precision[12];
    dtostrf(coor->lat, 4, 6, strlat);
    dtostrf(coor->lon, 4, 6, strlon);
    dtostrf(coor->altitude, 6, 1, stralt);
    dtostrf(coor->hdop, 2, 2, strhdop);
    sprintf(buff, "Fecha:%s\nAltitud: %s\n HDOP:%s \nPrec: %s\n https://www.google.com/maps/search/?api=1&query=%s,%s ", coor->getFecha(strfecha), stralt, strhdop, coor->getPrecision(precision), strlat, strlon);
    Utiles::printCOM(buff);
    char* tlf;
    SMSEnviados = conf->GetLen() > 0;
    for (int i = 0; i < conf->GetLen(); i++)
    {
        tlf = conf->GetTlfInfo(i);
        if (!tlf || !tlf[0])
            continue;

        if (!sim->EnviaSMS(tlf, buff))
        {
            Utiles::printCOM("Error al enviar sms info");
            SMSEnviados = false;
        }
    }
}
  void ReporteManager::enviaDataGPRS()
  {
      char* apn = conf->GetAPN();
      char* srv = conf->GetSRV();
      GPRSdata = false;
      if (!apn[0] || !srv[0])
      {
          return;
      }
      Utiles::printCOM("envia datos gprs ");
      DataGPSSimManager* coor = sim->GetUltGPS();

      //envia mensaje inicial------------------------------
      char buff[256];
      char strlat[16];
      char strlon[16];
      char strfecha[24];
      char stralt[16];
      char strpres[16];
      char strtem[16];
      char strtemInt[16];
      char strhdop[16];
      char strvdop[16];
      char precision[12];
      dtostrf(coor->lat, 4, 6, strlat);
      dtostrf(coor->lon, 4, 6, strlon);
      dtostrf(coor->altitude, 6, 1, stralt);
      dtostrf(Pres, 6, 1, strpres);
      dtostrf(TempExt, 6, 1, strtem);
      dtostrf(TempInt, 6, 1, strtemInt);
      dtostrf(coor->hdop, 2, 2, strhdop);
      dtostrf(coor->vdop, 2, 2, strvdop);
      sprintf(buff, "%s%s/%s/%s/%s/ TempEx=%soC TempInt=%soC Prec=%s/ Pres=%smBar/ HDOP=%s; VDOP=%s ", srv, coor->getFecha(strfecha), strlat, strlon, stralt, strtem, strtemInt, coor->getPrecision(precision), strpres, strhdop, strvdop);
      Utiles::printCOM(buff);
      char* tlf;
      for (int i = 0; i < 5; i++)
      {
          if (sim->IniciaNetwork(apn, 0, 0))
          {
              GPRSdata = true;
              break;
          }
      }
      if (GPRSdata)
      {
          GPRSdata = sim->httpGet(buff);
      }
      sim->Desconecta();
  }

