#include <WiFi.h>
#include <esp_wifi.h>

// Replace with your network credentials (STATION)
char ssid[16] = {"Wokwi-GUEST"};
char password[16] = {""};


// Get stored WiFi credentials
bool getWiFiCredentials(wifi_config_t *conf ) {  
  esp_err_t err = esp_wifi_get_config(WIFI_IF_STA, conf);
  if (err) {
    Serial.printf("Get WiFi config: %s", esp_err_to_name(err));
    return false;
  }  
  return true;
}

// Store WiFi credentials
void setWiFiCredentials(const char* ssid, const char* pass) {
  wifi_config_t stationConf;
  esp_wifi_get_config(WIFI_IF_STA, &stationConf);

  // Azzera la configurazione attuale se necessario
  // memset(&stationConf, 0, sizeof(stationConf));

  // Memorizza le nuove credenziali. 
  // stationConf.sta.ssid/password sono due array di uint8_t 
  // quindi è necessario fare il parsing per usare la funzione strcpy(). 
  // In alternativa è possibile usare memcpy()
  strcpy((char*)&stationConf.sta.ssid, ssid);
  strcpy((char*)&stationConf.sta.password, pass);

  esp_err_t err = esp_wifi_set_config(WIFI_IF_STA, &stationConf);
  if (err) {
    Serial.printf("Set WiFi config: %s", esp_err_to_name(err));
  }
}


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

  // La credenziali WiFi vengono salvate nella flash memory 
  // quando la connessione viene instaurata con successo a meno che 
  // sia esplicitamente indicato in modo diverso
  
  WiFi.persistent(false);
  Serial.print("Connecting to WiFi");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }
  Serial.println("\nConnected!");

  // Stampo le credenziali attualmente salvate negli array ssid e password  
  Serial.printf("\nActual SSID: %s\n", ssid);
  Serial.printf("Actual Password: %s\n", password);

  // Modifico le credenziali 
  setWiFiCredentials("nuovoSSID", "nuovaPassword");

  wifi_config_t conf;                 // Struct definita in esp_wifi.h
  if (getWiFiCredentials(&conf)) {

    // Se serve, memorizzo di nuovo le credenziali negli array ssid e password
    strcpy(ssid, (char*)conf.sta.ssid);
    strcpy(password, (char*)conf.sta.password);    
    Serial.printf("\nOld SSID: %s\n", ssid);
    Serial.printf("Old Password: %s\n", password);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
}