#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <FS.h>

const char* ssid     = "FiberHGW_ZT5A27_2.4GHz";
const char* password = "hYyYzPXcAP";
int curr;

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org",0,10000);


AsyncWebServer server(80);


const char* PARAM_STRING = "inputString";
const char* PARAM_INT = "inputInt";
const char* PARAM_FLOAT = "inputFloat";

// HTML web page to handle 3 input fields (inputString, inputInt, inputFloat)
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
  <title>RB KOMBI ZAMANLAYICI</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script>
    function submitMessage1() {
      alert("Parametre Kaydedildi.");
      setTimeout(function(){ document.location.reload(false); }, 500);   
    }
  </script>
  <script>
    function submitMessage2() {
      alert("Saat-1 değeri kaydedildi.");
      setTimeout(function(){ document.location.reload(false); }, 500);   
    }
  </script>
  <script>
    function submitMessage3() {
      alert("Saat-2 değeri kaydedildi.");
      setTimeout(function(){ document.location.reload(false); }, 500);   
    }
  </script></head><body>
  <h1 style="color:red;">RIGHTBASS KOMBI ZAMANLAYICI </h1>
  <hr>
  </body><body>
<pre>


</pre>
  
  <form action="/get" target="hidden-form">
    PARAMETRE AYARI (kayitli parametre: %inputString% ): <input type="text" name="inputString">
    <input type="submit" value="Submit" onclick="submitMessage1()">
  </form><br>
  <form action="/get" target="hidden-form">
    ÇALIŞMA SAATi-1(kayitli saat: %inputInt% ): <input type="number " name="inputInt">
    <input type="submit" value="Submit" onclick="submitMessage2()">
  </form><br>
  <form action="/get" target="hidden-form">
    ÇALIŞMA SAATi-2(kayitli saat: %inputFloat% ): <input type="number " name="inputFloat">
    <input type="submit" value="Submit" onclick="submitMessage3()">
  </form>
  
<pre>

Saat değerleri 00-24 arasıdır. Dışındaki herhangi bir rakam saat ayarı iptal olarak algılanır.
</pre>
  <p>_______LEJANT_______________</p>
  <p>(Parametre) <span style="color:red;font-weight:bold;">A</span>= Saat1: 1 saat , Saat2: 1 saat.</p>
  <p>(Parametre) <span style="color:red;font-weight:bold;">B</span>= Saat1: 1 saat , Saat2: 2 saat.</p>
  <p>(Parametre) <span style="color:red;font-weight:bold;">C</span>= Saat1: 2 saat , Saat2: 2 saat.</p>
  <p>(Parametre) <span style="color:red;font-weight:bold;">D</span>= Saat1: 2 saat , Saat2: 1 saat.</p>
  <p>Parametre değeri boş ise A seçilmiş sayılır.</p>
  <iframe style="display:none" name="hidden-form"></iframe>
</body></html>)rawliteral";


void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}

String readFile(fs::FS &fs, const char * path){
 // Serial.printf("Reading file: %s\r\n", path);
  File file = fs.open(path, "r");
  if(!file || file.isDirectory()){
  //  Serial.println("- empty file or failed to open file");
    return String();
  }
//  Serial.println("- read from file:");
  String fileContent;
  while(file.available()){
    fileContent+=String((char)file.read());
  }
  file.close();
 // Serial.println(fileContent);
  return fileContent;
}

void writeFile(fs::FS &fs, const char * path, const char * message){
 // Serial.printf("Writing file: %s\r\n", path);
  File file = fs.open(path, "w");
  if(!file){
 //   Serial.println("- failed to open file for writing");
    return;
  }
  if(file.print(message)){
 //   Serial.println("- file written");
  } else {
  //  Serial.println("- write failed");
  }
  file.close();
}

// Replaces placeholder with stored values
String processor(const String& var){
  //Serial.println(var);
  if(var == "inputString"){
    return readFile(SPIFFS, "/inputString.txt");
  }
  else if(var == "inputInt"){
    return readFile(SPIFFS, "/inputInt.txt");
  }
  else if(var == "inputFloat"){
    return readFile(SPIFFS, "/inputFloat.txt");
  }
  return String();
}


void setup() {
  // put your setup code here, to run once:
 // Serial.begin(115200);
  pinMode(0,OUTPUT);
  digitalWrite(0, HIGH);

  
  SPIFFS.begin();
WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
 // Serial.println();
 // Serial.print("IP Address: ");
//  Serial.println(WiFi.localIP());
  if(!SPIFFS.begin()){
  //    Serial.println("An Error has occurred while mounting SPIFFS");
      return;}
  timeClient.begin();
  // Set offset time in seconds to adjust for your timezone, for example:
  // GMT +1 = 3600
  // GMT +8 = 28800
  // GMT -1 = -3600
  // GMT 0 = 0
  timeClient.setTimeOffset(10800);
  // Send web page with input fields to client
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  // Send a GET request to <ESP_IP>/get?inputInt2=<inputMessage>
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    // GET inputString value on <ESP_IP>/get?inputString=<inputMessage>
    if (request->hasParam(PARAM_STRING)) {
      inputMessage = request->getParam(PARAM_STRING)->value();
      writeFile(SPIFFS, "/inputString.txt", inputMessage.c_str());
    }
    // GET inputInt value on <ESP_IP>/get?inputInt=<inputMessage>
    else if (request->hasParam(PARAM_INT)) {
      inputMessage = request->getParam(PARAM_INT)->value();
      writeFile(SPIFFS, "/inputInt.txt", inputMessage.c_str());
    }
    // GET inputFloat value on <ESP_IP>/get?inputFloat=<inputMessage>
    else if (request->hasParam(PARAM_FLOAT)) {
      inputMessage = request->getParam(PARAM_FLOAT)->value();
      writeFile(SPIFFS, "/inputFloat.txt", inputMessage.c_str());
    }
    else {
      inputMessage = "No message sent";
    }
   // Serial.println(inputMessage);
    request->send(200, "text/text", inputMessage);
  });
  server.onNotFound(notFound);
  server.begin();

}

void loop() {
  // put your main code here, to run repeatedly:

timeClient.update();
int curr = timeClient.getHours();
int swmod1;
String mod1 = readFile(SPIFFS, "/inputString.txt");
int set2 = readFile(SPIFFS, "/inputInt.txt").toInt();
int set3 = readFile(SPIFFS, "/inputFloat.txt").toInt();
if (mod1 == "A"){  swmod1=1;}
if (mod1 == "B"){  swmod1=2;}
if (mod1 == "C"){  swmod1=3;}
if (mod1 == "D"){  swmod1=4;}
switch(swmod1){
  case 1: 
  if( set2 == curr || set3 == curr )
{delay(500);
digitalWrite(0, LOW);
delay(100);}
else{
  digitalWrite(0, HIGH);}
  break;
  case 2: 
  if( set2 == curr || set3 == curr || set3+1 == curr )
{
delay(500);
digitalWrite(0, LOW);
delay(100);}
else{
  digitalWrite(0, HIGH);}
  break;
  case 3: 
  if( set2 == curr || set3 == curr || set3+1 == curr || set2+1 == curr )
{
delay(500);
digitalWrite(0, LOW);
delay(100);}
else{
  digitalWrite(0, HIGH);}
  break;
  case 4: 
  if( set2 == curr || set3 == curr || set2+1 == curr )
{
delay(500);
digitalWrite(0, LOW);
delay(100);}
else{
  digitalWrite(0, HIGH);}
  break;
  default:
  if( set2 == curr || set3 == curr )
{
delay(500);
digitalWrite(0, LOW);
delay(100);}
else{
  digitalWrite(0, HIGH);}
  break;
  
}
  
  }
