#ifndef WIFISETUP_H
#define WIFISETUP_H

#ifdef ESP32
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#endif

#ifdef ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#endif

#include <EEPROM.h>

#ifdef ESP32
AsyncWebServer server(80);
#endif

#ifdef ESP8266
ESP8266WebServer server(80);
#endif

#define P_RESET 12                   //Edit here pin Reset

int Reset = 1;

// EEPROM byte used  (EEPROM range byte 0-511)
int ssidAddress = 0;
int passAddress = 100;
int Rst = 250;

const char* ssid = "ESP_CONFIG";     // Edit here AP name
const char* password = "12345678";   //Edit here AP password
IPAddress softAPIP(192, 168, 4, 1);  //Edit here AP website IP

String wifi_ssid = "";
String wifi_pass = "";

const char* html = R"(
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
</head>
  <body>
    <h2>ESP32 Configuration Wi-Fi</h2>
    <form id="myForm">
      SSID WiFi: <input type="text" id="input1" name="SSID WiFi:"><br><br>
      Password: <input type="text" id="input2" name="Password:"><br><br>
      <input type="submit" value="Send">
    </form>
  </body>
<script>
document.getElementById("myForm").onsubmit = function(e) {
  e.preventDefault();
  var input1Value = encodeURIComponent(document.getElementById("input1").value);
  var input2Value = encodeURIComponent(document.getElementById("input2").value);

  fetch("/", {
    method: "POST",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
    },
    body: "input1=" + input1Value + "&input2=" + input2Value,
  })
      .then((response) => {
        console.log("Data sent successfully.");
      })
      .catch((error) => {
        console.error("Error sending data.");
      });
  };
</script>
</html>
)";

void writeStringToEEPROM(int address, const String &data) {
  for (int i = 0; i < data.length(); i++) {
    EEPROM.write(address + i, data[i]);
  }
  EEPROM.write(address + data.length(), '\0');
  EEPROM.commit();
}

String readStringFromEEPROM(int address) {
  String result = "";
  char c;
  for (int i = 0; (c = EEPROM.read(address + i)) != '\0'; i++) {
    result += c;
  }
  return result;
}

void saveCredentialsToEEPROM(const String &ssid, const String &pass) {
  writeStringToEEPROM(ssidAddress, ssid);
  writeStringToEEPROM(passAddress, pass);
}

void CheckReset(){
    if(digitalRead(P_RESET) == LOW){
    riavvio1:
    if(digitalRead(P_RESET) == HIGH){
    EEPROM.write(Rst, 1);
    EEPROM.commit();
    Serial.println("Reset");
    } else {goto riavvio1;}
  }
}

#ifdef ESP8266
void handleRootGet() {
  server.send(200, "text/html", html);
}

void handleRootPost() {
  String input1 = server.arg("input1");
  String input2 = server.arg("input2");

  wifi_ssid = input1;
  wifi_pass = input2;

  Serial.print("SSID: ");
  Serial.println(input1);
  Serial.print("Password: ");
  Serial.println(input2);
  Serial.println("Restarting..");
  saveCredentialsToEEPROM(wifi_ssid, wifi_pass);
  server.send(200, "text/plain", "Data received successfully! Restarting...");
  EEPROM.write(Rst, 0);
  EEPROM.commit();
  delay(2000);
  ESP.restart();
}
#endif

void WiFiSetup(){
  pinMode(P_RESET, INPUT_PULLUP);
  EEPROM.begin(511);
  Serial.println("Starting..");
  Reset = EEPROM.read(Rst);
  String savedSsid = readStringFromEEPROM(ssidAddress);
  String savedPass = readStringFromEEPROM(passAddress);
  wifi_ssid = savedSsid;
  wifi_pass = savedPass;

 if(Reset == 1){
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(softAPIP, IPAddress(0, 0, 0, 0), IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssid, password);
  Serial.println("> Configuration mode <");
  Serial.println("Access Point Started!");
  Serial.print("AP SSID: ");
  Serial.print(ssid);
  Serial.print(" Password: ");
  Serial.println(password);
  Serial.println("Configuration page: http://192.168.4.1");

#ifdef ESP32
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/html", html);
  });
  server.on("/", HTTP_POST, [](AsyncWebServerRequest *request){
    String input1 = request->arg("input1");
    String input2 = request->arg("input2");
    wifi_ssid = input1;
    wifi_pass = input2;
  Serial.print("SSID: ");
  Serial.println(input1);
  Serial.print("Password: ");
  Serial.println(input2);
  Serial.println("Restarting..");
    saveCredentialsToEEPROM(wifi_ssid, wifi_pass);
    request->send(200, "text/plain", "Data received successfully! Restarting...");
    EEPROM.write(Rst, 0);
    EEPROM.commit();
    delay(2000);
    ESP.restart();
  });
  server.begin();
#endif

#ifdef ESP8266
    server.on("/", HTTP_GET, handleRootGet);
    server.on("/", HTTP_POST, handleRootPost);
    server.begin();
#endif

 } else {
  
  WiFi.begin(wifi_ssid.c_str(), wifi_pass.c_str());
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connection in progress...");
    CheckReset();
  }
  Serial.println("Connected to the Wi-Fi network.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  }
}


void WiFiLoop(){
  CheckReset();
  #ifdef ESP8266
  server.handleClient();
  #endif
}


#endif
