//************************************      Auteur  59Jag       *******************************************************
//Ce programme Arduino pour ESP32 récupère les informations relatives aux jours EJP via une API d'EDF. 
//Vérifie si la date est dans la période EJP (entre le 1er novembre et le 30 avril).
//Écarte automatiquement les week-ends (EJP ne s'applique pas les samedis et dimanches).
//Génère une URL pour interroger l'API EDF avec les dates d'aujourd'hui et de demain.
//Récupère et analyse les informations sur les statuts EJP (jourStatus et demainStatus) via une requête HTTP GET.
//ajout des en-têtes HTTP (HTTP headers) à la requête pour Définir l'origine de la requête, 
//simulant qu'elle provient d'un navigateur accédant au site officiel d'EDF.
//cela donne l'impression que la requête est envoyée depuis la page web du portail EDF https://particulier.edf.fr
//*****************************************************************************************************************************

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

#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define NTP_SERVER     "pool.ntp.org"
#define UTC_OFFSET     0
#define UTC_OFFSET_DST 0

String dateJour;
int mois;
int jour;
int jourSemaine;
int endIndex;
String jourStatus;             
String demainStatus; 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
String getFormattedDate(int daysOffset = 0) {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("impossible de recup time");
    return "";
  }
  // Ajouter un décalage en jours si nécessaire (pour "demain")
  time_t rawTime = mktime(&timeinfo) + (daysOffset * 24 * 3600); // Ajout en secondes 
  localtime_r(&rawTime, &timeinfo);                              // Appliquer le décalage
  jour = timeinfo.tm_mday;                                       // Jour du mois (1-31)
  mois = timeinfo.tm_mon + 1;                                    // Mois (0-11, donc +1 pour avoir 1-12)
  jourSemaine = timeinfo.tm_wday;                                // Jour de la semaine (0 = dimanche, ..., 6 = samedi)
  char dateBuffer[11];                                           // AAAA-MM-JJ : 10 caractères + null terminator
  strftime(dateBuffer, sizeof(dateBuffer), "%Y-%m-%d", &timeinfo);
  return String(dateBuffer);
}
void setup() {////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  Serial.begin(115200);
  delay(1000);

  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
 
  Serial.print("Connexion au Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnecté au Wi-Fi !");
  Serial.println(WiFi.localIP());
  configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
  dateJour = getFormattedDate();                                      // Date d'aujourd'hui au format AAAA-MM-JJ
  Serial.print("jour de la semaine ");
  Serial.println(jourSemaine);
  if (mois > 10 || mois < 4){                                         //ejp seulement entre  1 novembre au 31 Avril
     if (!(jourSemaine == 6)) {                                       //samedi dimanche pas d ejp (0 = dimanche, ..., 6 = samedi)
       Serial.println("Periode EJP ");        
       recupDataApi(); 
     }else{  
       Serial.println("pas de ejp le WeeekEnd");
      jourStatus="NON_EJP"; 
      demainStatus ="NON_EJP";                                                   
    }                                                               
  }else{
    Serial.println("hors Periode ejp du 1 novembre au 31 Avril");
    jourStatus="NON_EJP"; 
    demainStatus ="NON_EJP"; 
  }
   Serial.println("Resultat");
   Serial.println("aujourd hui "+ jourStatus);
   Serial.println("demain " + demainStatus);
} 
////////////////////////////////////////////////////////////////////////////////////////
String extractValue(String source, String startDelimiter, String endDelimiter) {
  int startIndex = source.indexOf(startDelimiter);
  if (startIndex == -1) return "";                              // Délimiteur de début introuvable
  startIndex += startDelimiter.length();                        // Avancer après le délimiteur de début
  int endIndex = source.indexOf(endDelimiter, startIndex);
  if (endIndex == -1) return "";                                // Délimiteur de fin introuvable
  return source.substring(startIndex, endIndex);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
void recupDataApi() {
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Date aujourd hui "+ dateJour);
String dateDemain = getFormattedDate(1); // Date de demain au format AAAA-MM-JJ
Serial.println("Date demain "+ dateDemain);
String apiURL = "https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement";
apiURL += "?option=EJP";
apiURL += "&dateApplicationBorneInf=" + dateJour;
apiURL += "&dateApplicationBorneSup=" + dateDemain;
apiURL += "&identifiantConsommateur=src";
Serial.println("URL générée : " + apiURL);
Serial.println(" ");
HTTPClient http;
http.begin(apiURL);
http.addHeader("Accept", "application/json");
http.addHeader("Content-Type", "application/json");
http.addHeader("Origin", "https://particulier.edf.fr");
http.addHeader("Referer", "https://particulier.edf.fr/");
http.addHeader("application-origine-controlee", "site_RC");
http.addHeader("situation-usage", "Jours Effacement");
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
  String EJPdata = http.getString(); 
  Serial.println("Reponse de l API "); 
  Serial.println(EJPdata);
  jourStatus = extractValue(EJPdata, dateJour + "\",\"statut\":\"", "\""); 
  demainStatus = extractValue(EJPdata, dateDemain +"\",\"statut\":\"" , "\"}]"); 
} else {
  Serial.print("Erreur dans la requête HTTP : ");
  Serial.println(httpResponseCode);
}
http.end(); // Fin de la requête
} else {
Serial.println("Wi-Fi non connecté !");
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
//zzzzzzzzzzzzzz
}