#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>

//ADD your WIFI credentials!!!
const char* ssid = "USERNAME";
const char* password = "PASSWORD";
//ExampleURL = "/v1/forec....EXAMPLE URL";
//Paste your URL here. Don't include "api.open-meteo.com"!
char* url = "";





//------------------------------------------------------------------------------------------------------ Nothing below is of interest!

//Do ignore my crazy variable usage and excessive programming methods
//A great programming oppertunity for you - improve the code
char* host = "api.open-meteo.com";
double tempH = 0.0;
double tempL = 0.0;
double tempTH = 0.0;
double tempTL = 0.0;
int iter = 0;
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  WiFi.begin(ssid, password);
  Serial.print("C");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  WiFiClient client;
  if (!client.connect(host, 80)) {
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("E");
    return;
  } else {
    digitalWrite(LED_BUILTIN, LOW);
    Serial.print("D");
  }
  // Send the request
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  Serial.print("L");
  // Wait for the response
  while (!client.available()) {
    delay(500);
  }
  //Serial.print("payload");
  // Read the response
  digitalWrite(LED_BUILTIN, HIGH);
  String payload = client.readString();
  delay(250);
  //Serial.print("Sanitize");
  //Serial.write("Sanitize");
  // Extract the JSON part of the response
  int bodyStart = payload.indexOf("\r\n\r\n");
  String json = payload.substring(bodyStart + 4);
  int startIndex = json.indexOf("{");
  int endIndex = json.lastIndexOf("}");
  if (startIndex != -1 && endIndex != -1) {
    json = json.substring(startIndex, endIndex + 1);
    //Serial.println(json);
  } else {
    Serial.println("E");
  }

  DynamicJsonDocument doc(20000);
  deserializeJson(doc, json);
  delay(250);
  digitalWrite(LED_BUILTIN, HIGH);
  //Cry about it!
  tempH = doc["daily"]["temperature_2m_max"][0];
  tempL = doc["daily"]["temperature_2m_min"][0];
  tempTH = doc["daily"]["temperature_2m_max"][1];
  tempTL = doc["daily"]["temperature_2m_min"][1];
  int WheatherCode1 = doc["daily"]["weathercode"][0];
  int WheatherCode2 = doc["daily"]["weathercode"][1];
  int WheatherCode3 = doc["daily"]["weathercode"][2];
  int WheatherCode4 = doc["daily"]["weathercode"][3];
  int WheatherCode5 = doc["daily"]["weathercode"][4];
  int WheatherCode6 = doc["daily"]["weathercode"][5];
  int WheatherCode7 = doc["daily"]["weathercode"][6];
  int StartEpoch = doc["hourly"]["time"][0];
  int HourCode1 = doc["hourly"]["weathercode"][0];
  int HourCode2 = doc["hourly"]["weathercode"][1];
  int HourCode3 = doc["hourly"]["weathercode"][2];
  int HourCode4 = doc["hourly"]["weathercode"][3];
  int HourCode5 = doc["hourly"]["weathercode"][4];
  int HourCode6 = doc["hourly"]["weathercode"][5];
  int HourCode7 = doc["hourly"]["weathercode"][6];
  int HourCode8 = doc["hourly"]["weathercode"][7];
  int HourCode9 = doc["hourly"]["weathercode"][8];
  int HourCode10 = doc["hourly"]["weathercode"][9];
  int HourCode11 = doc["hourly"]["weathercode"][10];
  int HourCode12 = doc["hourly"]["weathercode"][11];
  int HourCode13 = doc["hourly"]["weathercode"][12];
  int HourCode14 = doc["hourly"]["weathercode"][13];
  int HourCode15 = doc["hourly"]["weathercode"][14];
  int HourCode16 = doc["hourly"]["weathercode"][15];
  int HourCode17 = doc["hourly"]["weathercode"][16];
  int HourCode18 = doc["hourly"]["weathercode"][17];
  int HourCode19 = doc["hourly"]["weathercode"][18];
  int HourCode20 = doc["hourly"]["weathercode"][19];
  int HourCode21 = doc["hourly"]["weathercode"][20];
  int HourCode22 = doc["hourly"]["weathercode"][21];
  int HourCode23 = doc["hourly"]["weathercode"][22];
  int HourCode24 = doc["hourly"]["weathercode"][23];

  delay(500);
  //COPE!!!
  Serial.write("{");
  Serial.print(tempH);
  Serial.print("&");
  Serial.print(tempL);
  Serial.print("&");
  Serial.print(tempTH);
  Serial.print("&");
  Serial.print(tempTL);
  Serial.print("&");
  delay(5);
  Serial.print(WheatherCode1);
  Serial.print("&");
  Serial.print(WheatherCode2);
  Serial.print("&");
  Serial.print(WheatherCode3);
  Serial.print("&");
  Serial.print(WheatherCode4);
  Serial.print("&");
  Serial.print(WheatherCode5);
  Serial.print("&");
  Serial.print(WheatherCode6);
  Serial.print("&");
  Serial.print(WheatherCode7);
  Serial.print("&");
  delay(5);
  Serial.print(StartEpoch);
  Serial.print("&");
  delay(5);
  Serial.print(HourCode1);
  Serial.print("&");
  Serial.print(HourCode2);
  Serial.print("&");
  Serial.print(HourCode3);
  Serial.print("&");
  Serial.print(HourCode4);
  Serial.print("&");
  Serial.print(HourCode5);
  Serial.print("&");
  Serial.print(HourCode6);
  Serial.print("&");
  Serial.print(HourCode7);
  Serial.print("&");
  Serial.print(HourCode8);
  Serial.print("&");
  Serial.print(HourCode9);
  Serial.print("&");
  Serial.print(HourCode10);
  Serial.print("&");
  Serial.print(HourCode11);
  Serial.print("&");
  Serial.print(HourCode12);
  Serial.print("&");
  Serial.print(HourCode13);
  Serial.print("&");
  Serial.print(HourCode14);
  Serial.print("&");
  Serial.print(HourCode15);
  Serial.print("&");
  Serial.print(HourCode16);
  Serial.print("&");
  Serial.print(HourCode17);
  Serial.print("&");
  Serial.print(HourCode18);
  delay(5);
  Serial.print("&");
  Serial.print(HourCode19);
  Serial.print("&");
  Serial.print(HourCode20);
  Serial.print("&");
  Serial.print(HourCode21);
  delay(5);
  Serial.print("&");
  Serial.print(HourCode22);
  Serial.print("&");
  Serial.print(HourCode23);
  Serial.print("&");
  Serial.print(HourCode24);
  delay(5);
  Serial.print("}");
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(20000);
  ESP.deepSleep(0);
}

void loop() {
  //Nothing, NADA
}
