/* ESP32 WiFi Scanning example */

#include <HTTPClient.h>
#include <WiFi.h>
#include "DHTesp.h"
#include <ESPSupabase.h>

// Configurações do Wi-Fi
const char* ssid = "SEU_SSID";
const char* password = "SUA_SENHA";

const int LDR_PIN = 34;

const int DHT_PIN = 22;

DHTesp dhtSensor;
Supabase sb;


// URL da API da Supabase
const char* supabase_url = "https://nmnypmqusuecpiacoltm.supabase.co";
const char* anon_key = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im5tbnlwbXF1c3VlY3BpYWNvbHRtIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjY1Mjg0NTMsImV4cCI6MjA0MjEwNDQ1M30.shI-oqtvFcQDj9ag_ay68bEuH2ZWcKoP97o5nJUsms8";

const char* table = "Sensores";
bool upsert = false;


void setup() {
  Serial.begin(115200);
  delay(1000);

  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
  
  Serial.println("Inicializando WiFi...");
  WiFi.mode(WIFI_STA);
  Serial.println("Setup feito!");

  Serial.println("Procurando...");
  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("Procura feita!");
  if (n == 0) {
    Serial.println("Redes não foram encontradas. Tentando novamente");
    while (n == 0)
      Serial.println(". ");
      delay(0.1);
      n = WiFi.scanNetworks();
  } else {
    Serial.println();
    Serial.print(n);
    Serial.println(" redes disponíveis!");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
      delay(10);
      Serial.print("Connectando a ");
      Serial.print(WiFi.SSID(i));
      WiFi.begin("Wokwi-GUEST", "", 6);
      while (WiFi.status() != WL_CONNECTED) {
        delay(100);
        Serial.print(".");
      }
      Serial.println(" Conectado!");
    }
  }
  Serial.println("");
}

void loop() {

  // Wait a bit before scanning again
  delay(5000);

  // read temperature
  float temp  = dhtSensor.getTemperature();
  Serial.println("Temperatura: " + String(temp));
  // read humidity
  float humi = dhtSensor.getHumidity();
  Serial.println("Umidade: " + String(humi));

  float light = analogRead(LDR_PIN);
  Serial.println("Luz: " + String(light));

  // You can also use library like ArduinoJson generate this
  String JSON = "{\"temperatura\": " + String(temp) + ", \"umidade\": " + String(humi) + ", \"luminosidade\": " + String(light) + "}";

  // Beginning Supabase Connection
  sb.begin(supabase_url, anon_key);

  int code = sb.insert(table, JSON, upsert);
  // Verifica se a operação foi bem-sucedida (geralmente códigos 200-299 indicam sucesso)
  if (code >= 200 && code < 300) {
    Serial.println("Conexão bem-sucedida! Código: " + String(code));
  } else {
    Serial.println("Falha na conexão! Código: " + String(code));
  }

  Serial.println(code);
  // Resetando query e aguardando
  sb.urlQuery_reset();
  delay(5000);
}