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

const char* ssid = "Wokwi-GUEST";
const char* password = "";

const String url = "https://api.open-meteo.com/v1/forecast?latitude=47.332253&longitude=-1.063842&current=temperature_2m,wind_speed_10m&hourly=temperature_2m,relative_humidity_2m,wind_speed_10m";

const int ledCold = 2;
//int leds[] = {D0,D1,D2,D3,D4,D5,D6,D7};
const int ledTestLux = 7;

// These constants should match the photoresistor's "gamma" and "rl10" attributes
const float GAMMA = 0.7;
const float RL10 = 50;
const int inputLux = 10;

HTTPClient http;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Hello, ESP32-C3!");

  pinMode(ledCold, OUTPUT);
  pinMode(ledTestLux, OUTPUT);
  pinMode(inputLux, INPUT);

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  while(!Serial);

  Serial.println("WiFi Setup done!");
  WiFiConnect();
  int currentTemp = getCurrentTemp();
  displayTemp(currentTemp);
}

void WiFiConnect(void){
    WiFi.begin(ssid, password);
    Serial.print("Connecting to ");
    Serial.println(ssid);

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

    Serial.println("");
    Serial.println("WiFi connected!");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
}

int getCurrentTemp(void){
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("Getting current data...");

    http.begin(url);
    int httpCode = http.GET();
    Serial.print("HTTP Code: ");
    Serial.println(httpCode);
    if (httpCode > 0) {
      StaticJsonDocument<768> doc;
      DeserializationError error = deserializeJson(doc, http.getString());

      if (error) {
        Serial.print(F("deserializeJson failed: "));
        Serial.println(error.f_str());
        delay(2500);

        return -1000;
      }

      Serial.print("HTTP Status Code: ");
      Serial.println(httpCode);

      int currentTemp = doc["current"]["temperature_2m"].as<int>();
      Serial.print("currentTemp: ");
      Serial.println(currentTemp);
      http.end();

      return currentTemp;
    }
  }
}

float getLux(void){
  int analogValue = analogRead( inputLux);
  float voltage = analogValue / 1024. * 5;
  float resistance = 2000 * voltage / (1 - voltage / 5);
  float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));

  return lux;
}

void displayTemp(int temp){
  if(temp >= 27){
    digitalWrite(D7, HIGH);
  } 
  else if(temp >= 26 ){
    digitalWrite(D6, HIGH);
  }
  else if(temp >= 24 ){
    digitalWrite(D5, HIGH);
  }
  else if(temp >= 22 ){
    digitalWrite(D4, HIGH);
  }
  else if(temp >= 20 ){
    digitalWrite(D3, HIGH);
  }
  else if(temp >= 18 ){
    digitalWrite(D2, HIGH);
  }
  else if(temp >= 16 ){
    digitalWrite(D1, HIGH);
  }
  else {
    digitalWrite(D0, HIGH);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(10); // this speeds up the simulation

  
}