#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

StaticJsonDocument<512> doc;

//Red

//const char* ssid= "BUAP_Estudiantes";
const char* ssid= "Wokwi-GUEST";
const char* pass= "";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid,pass);
  Serial.print("Conectando a WiFi");

  while (WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(500);

  }

  Serial.println("Conectado a internet");
  Serial.print("Dirección IP: ");
  Serial.println(WiFi.localIP());


}

void loop() {
 
  if((WiFi.status() == WL_CONNECTED)){
      Serial.println("");
      Serial.println("Buscando datos...");
      HTTPClient client;
      
      client.begin("https://api.n2yo.com/rest/v1/satellite/positions/25544/19.00213/-98.20237/0/1/&apiKey=F6EPF9-HP5CKD-DZ8AMY-4ZIX");
      //client.begin("https://celestrak.org/NORAD/elements/gp.php?CATNR=25544&FORMAT=JSON");
      int httpCode = client.GET();

      if(httpCode>0){
        String payload=client.getString();
        Serial.println("Código de estatus: "+ String(httpCode)); //Indica si hay conexión
        //Serial.println(payload);
        
        //Código de datos de antena
        DeserializationError error = deserializeJson(doc, payload);

        if (error) {
          Serial.print("deserializeJson() failed: "); //Error de deserialización de la página
          Serial.println(error.c_str());
          return;
          }

        JsonObject info = doc["info"]; //Información del satélite
        const char* info_satname = info["satname"]; // Nombre del satélite
        int info_satid = info["satid"]; // ID NORAD de la página
        JsonObject positions_0 = doc["positions"][0]; //Posiciones
        double positions_0_satlatitude = positions_0["satlatitude"]; // Latitud
        double positions_0_satlongitude = positions_0["satlongitude"]; // Longitud
        float positions_0_sataltitude = positions_0["sataltitude"]; // Altitud 
        float positions_0_azimuth = positions_0["azimuth"]; // Azimut
        float positions_0_elevation = positions_0["elevation"]; // Elevación sin corrección
        double positions_0_ra = positions_0["ra"]; // Ascención recta
        double positions_0_dec = positions_0["dec"]; // Declinación
        long positions_0_timestamp = positions_0["timestamp"]; // Tiempo de la obteción de los datos
        bool positions_0_eclipsed = positions_0["eclipsed"]; // Eclipse
        float position_fixed;
        if(positions_0_elevation<0){
           position_fixed=0;
        }
        else{
           position_fixed=positions_0_elevation;
        }
        Serial.print("Nombre del satélite: ");
        Serial.println(info_satname);
        Serial.print("Azimut: ");
        Serial.println(positions_0_azimuth);
        Serial.print("Elevación: ");
        Serial.println(positions_0_elevation);
        Serial.print("Elevación arreglada: ");
        Serial.println(position_fixed);
        //Cualquier código de movimiento entra aquí, usar funciones de preferencia
        movimiento(positions_0_azimuth,position_fixed);

      }
      else{
        Serial.println("Conexión rechazada por el servidor");
      }




  }

  else {
    Serial.println("Conexión perdida");
  }

  delay(5000);
}

void movimiento(float a, float b){
  //Variables de coordenadas de observador
  float azimut=a;
  float elevacion=b;

  Serial.println("TEST");
  Serial.print("Usando azimut: ");
  Serial.println(azimut);
  Serial.print("Usando elevación: ");
  Serial.println(elevacion);
}