/*
	20.06.2025
	WiFi Manager für IoT  ohne WebServer für ESP8266 und ESP32
	siehe RandomNerdTutorial und DeepSeek
  mit Built-In-LED und Taster an GPIO14 (D5)
 
  Bei Tastendruck an GPIO14 (D5) zu Masse mit Restart, wird der Wifi_Manager Start erzwungen.
  192.168.4.1 lebt nur 5 Min.
  
  keine zusätzlichen Parameter

*/

#if defined(ESP8266)
//#define TASTER_PIN 0     // D3 = GPIO0 (⚠️ Vorsicht beim Boot!)
#define WIFI_BUTTON_PIN 5  // Taster an GPIO5 (D1) auch i2c SCL
#define LED_PIN 2          // D4 = GPIO2 (Built-in LED)
//#include <EEPROM.h>       // EEPROM für ESP8266 passiert intern im WifiManager
#elif defined(ESP32)
//#define TASTER_PIN 4      // GPIO4 (Safe)
#define WIFI_BUTTON_PIN 5  // Taster an GPIO5 (D1) auch i2c SCL
#define LED_PIN 2          // GPIO2 (Built-in LED)
//#include <Preferences.h>  // Bessere Alternative zu EEPROM passiert intern im WifiManager
#endif

#include <WiFiManager.h>    // von Tzapu
WiFiManager wifiManager;

#define AP_SSID    "ESP_AP_Config"

int rssi = 0;

void startWiFi_Manager() {

  pinMode(WIFI_BUTTON_PIN, INPUT_PULLUP);  // Taster mit internem Pull-up
  pinMode(LED_PIN, OUTPUT);                // LED für Status

  // Kurzes LED-Blinken zum Start
  digitalWrite(LED_PIN, HIGH);
  delay(200);
  digitalWrite(LED_PIN, LOW);
  delay(200);

  // Uncomment and run it once, if you want to erase all the stored information
  //wifiManager.resetSettings();

  // set custom ip for portal
  //wifiManager.setAPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));

  // Timeout für das Konfigurationsportal setzen (300 Sekunden)
  wifiManager.setConfigPortalTimeout(300);  // Timeout in sek: 5 Minuten

  // Callback für den AP-Modus die beim Start des AP-Modus aufgerufen wird.
  wifiManager.setAPCallback([](WiFiManager* wm) {
    Serial.println("Config-Portal gestartet! SSID: " + wm->getConfigPortalSSID());
  });

  // Callback nach erfolgreicher Konfiguration
  wifiManager.setSaveConfigCallback([]() {
	rssi = WiFi.RSSI();
	Serial.println("WLAN-Daten gespeichert!");
  });

  // Wenn Taster gedrückt (LOW), starte Config-Portal
  if (digitalRead(WIFI_BUTTON_PIN) == LOW) {
    delay(500);  // Entprellen
    if (digitalRead(WIFI_BUTTON_PIN) == LOW) {
      digitalWrite(LED_PIN, LOW);  // LED aus = Config-Modus
      Serial.println("Starte Config-Portal...");

      wifiManager.startConfigPortal(AP_SSID);  // AP mit SSID "ESP-Config"

      digitalWrite(LED_PIN, HIGH);  // LED an = Fertig
    }
  }

  // Automatische Verbindung mit ssid und pass vom eeprom versuchen, sonst start mit Access Point AP
  if (!wifiManager.autoConnect(AP_SSID)) {
    Serial.println("Fehler: Keine Verbindung und Timeout erreicht!\tESP restart");
    ESP.restart();  // Neustart bei Fehler
  }

  digitalWrite(LED_PIN, HIGH);  // LED an = Fertig
  Serial.println("Erfolgreich verbunden mit: " + WiFi.SSID());

  if (rssi < -80) {  // Schlechtes Signal
    Serial.println("Schwaches WiFi-Signal!");
  } else {
    Serial.print("WiFi-Signal ");   Serial.print(rssi); Serial.println(" dB");
  }
}

void checkWiFiConnection() {
  Serial.print("Checking WiFi... ");
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi getrennt! Versuche Reconnect... ");
    WiFi.reconnect();  // Neu verbinden

    // Automatische Verbindung mit ssid und pass vom eeprom versuchen, sonst start mit Access Point AP
    if (!wifiManager.autoConnect(AP_SSID)) {
      Serial.println("Fehler: Keine Verbindung und Timeout erreicht!\tESP restart");
      ESP.restart();  // Neustart bei Fehler
    } else {
      rssi = WiFi.RSSI();
      Serial.println("WiFi verbunden! IP: " + WiFi.localIP().toString());
      Serial.println("Signalstärke (RSSI): " + String(rssi) + " dB");
    }
  } else {
	rssi = WiFi.RSSI();
    Serial.println("WiFi ok!" + String(rssi) + " dB");
  }
}
