// import des librairies
#include <ESP8266WiFi.h>               // pour la gestion du wifi    
#include <ESP8266WebServer.h>          // pour créer un serveur web
#include <ESP8266mDNS.h>               // pour remplacer l'ip par un nom d'hote
#include <ESP8266HTTPUpdateServer.h>   // pour flasher le nodemcu par le web 

// vos identifiants réseau
const char* ssid = "XXXX";             // votre SSID   
const char* password = "YYYY";         // votre cle WIFI

const char* update_username = "XXXX";      // on defini un login pour la fonction update 
const char* update_password = "YYYY";      // on defini un mot de passe pour la fonction update 
const char* update_path = "/UPDATE";       // le chemin pour la fonction update (vous mettez ce que vous voulez /maj, /flash etc...)  

ESP8266WebServer serveur(80);              // on instance un serveur web nommé serveur accessible sur le port 80
ESP8266HTTPUpdateServer httpUpdater;       // on instance la fonction de mise a jour par le web nommé httpUpdater
MDNSResponder mdns;                        // on instance la fonction mdns 


// la fonction appelé dés qu'on ouvre la page d'accueil du serveur (une page html)
void handleRoot() {
  char page[] = "<body style='background:#7F7F7F;'>"               
  "<center><h2 style='color:#EC7878;'>La fonction Update</h2></center><br/>"
  "<center><p><a href=\"UPDATE\"><button style='background:#EC7878;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>update du programme</button></a></p></center><br/>"  
  "<center><h2>Commande de la led</h2></center><br/>" 
  "<center><div>"
  "<p><a href=\"ON\"><button style='background:#90EE90;>;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>ON</button></a> &nbsp; &nbsp; <a href=\"OFF\"><button style='background:#F78A8A;>;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>OFF</button></a> &nbsp; &nbsp;"  
  "</center></div>"  
  "</body>";                
  serveur.send(200, "text/html", page); // repond avec la page web codee en HTML
}
// le setup
void setup(void){  
  pinMode(LED_BUILTIN, OUTPUT);        // on met la led interne du NodeMCU en sortie
  digitalWrite(LED_BUILTIN, HIGH);     // on l'active pour l'éteindre (l'inverse du led branché sur un gpio)
  Serial.begin(115200);                // on ouvre la come série
  WiFi.begin(ssid, password);          // on se connecte au reseau
  Serial.println("");
  // on attend d'être connecté
  while (WiFi.status() != WL_CONNECTED) {   
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  // on donne les infos du réseau
  Serial.print("Connecté à ");
  Serial.println(ssid);
  Serial.print("Addresse IP : ");
  Serial.println(WiFi.localIP());
  // on defini la fonction de mise à jour avec nos paramètre (le serveur, le chemin, le login et mdp)
  httpUpdater.setup(&serveur, update_path, update_username, update_password);
  // on associe un nom d'hote a notre adresse ip et on l'affiche
  if (mdns.begin("nodemcu", WiFi.localIP())) {
    Serial.println("mdns: nodemcu.local");
  }
  // on associe la fonction handleRoot a la racine du serveur web
  serveur.on("/", handleRoot);

  // on associe cette fonction a la page /ON du serveur 
  serveur.on("/ON", [](){
    char page[] = "<body style='background:#7F7F7F;'>"               
    "<center><h2 style='color:#EC7878;'>La fonction Update</h2></center><br/>"
    "<center><p><a href=\"UPDATE\"><button style='background:#EC7878;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>update du programme</button></a></p></center><br/>"  
    "<center><h2>Commande de la led</h2></center><br/>" 
    "<center><div>"
    "<p><a href=\"ON\"><button style='background:#90EE90;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>ON</button></a> &nbsp; &nbsp; <a href=\"OFF\"><button style='background:#F78A8A;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>OFF</button></a></p>"
    "<p>Led ON</p>"
    "</center></div>"  
    "</body>";                
    serveur.send(200, "text/html", page); // repond avec la page web codee en HTML
    digitalWrite(LED_BUILTIN, LOW);       // on allume la led interne du nodeMCU
  });

  // on associe cette fonction a la page /OFF du serveur 
  serveur.on("/OFF", [](){
    char page[] = "<body style='background:#7F7F7F;'>"               
    "<center><h2 style='color:#EC7878;'>La fonction Update</h2></center><br/>"
    "<center><p><a href=\"UPDATE\"><button style='background:#EC7878;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>update du programme</button></a></p></center><br/>"  
    "<center><h2>Commande de la led</h2></center><br/>" 
    "<center><div>"
    "<p><a href=\"ON\"><button style='background:#90EE90;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>ON</button></a> &nbsp; &nbsp; <a href=\"OFF\"><button style='background:#F78A8A;border:2px solid black;font-size: 20px;padding: 20px 20px;border-radius: 25px;'>OFF</button></a></p>"
    "<p>Led OFF</p>"
    "</center></div>"  
    "</body>";                
    serveur.send(200, "text/html", page);   // repond avec la page web codee en HTML
    digitalWrite(LED_BUILTIN, HIGH);        // on éteint la led interne du nodeMCU
  });
  // on démarre le serveur web
  serveur.begin();
  // on affiche les infos pour ce connecter
  Serial.print("Pour ce connecté au serveur ouvre ");
  Serial.print(WiFi.localIP());  
  Serial.println(" ou http://nodemcu.local/ dans le navigateur web");
}

// la boucle
void loop(void){
  mdns.update();            // on s'assure de ne jamais perdre le nom d'hote
  serveur.handleClient();   // on lance l'écoute d'un client (une connexion au serveur)
}