#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>

#include "defines.h"
#include "configuration.h"


tConfigBlock configBlock;
const uint32_t MAGIC = 3235774468;
const char* CONFIG_SSID = "espconfig";
extern ESP8266WebServer webServer;

bool configSaved = false;


static bool checkAuthentication() {
    Serial.print("User: "); Serial.println(configBlock.confUser);
    Serial.print("Pass: "); Serial.println(configBlock.confPasswd);
	return webServer.authenticate(configBlock.confUser, configBlock.confPasswd);
}

void configServeIndex() {
  bool configValid = (configBlock.magic == MAGIC);

  if (! configValid) {
  configBlock.magic = MAGIC;
    strcpy(configBlock.confUser, "admin");
    strcpy(configBlock.confPasswd, "geheim123");
    strcpy(configBlock.wifiSsid, "test");
    strcpy(configBlock.wifiKey, "geheim");
    strcpy(configBlock.mqttBroker, "broker.hottis.de");
    strcpy(configBlock.mqttUser, "TwoLedSignal1");
    strcpy(configBlock.mqttPass, "geheim123");
    strcpy(configBlock.mqttClientId, "TwoLedSignal1");
    configBlock.mqttPort = 8883;
    strcpy(configBlock.mqttTopicLed1, "IoT/TwoLedSignal1/Led1");
    strcpy(configBlock.mqttTopicLed2, "IoT/TwoLedSignal1/Led2");
    strcpy(configBlock.mqttDebugTopic, "IoT/TwoLedSignal1/Debug");
    configBlock.debugMode = 0;
  }

  if (! checkAuthentication()) {
    return webServer.requestAuthentication();
  }  


  String buffer =
  "<!doctype html"
  "<html lang=\"en\">"
  "  <head>"
  "    <title>ESP8266 based TwoLedSignal</title>"
  "  </head>"
  "  <body>"
  "    <h1>ESP8266 based TwoLedSignal - ESP8266 Configuration Page</h1>";
  
  if (configSaved) {
    configSaved = false;
    buffer += "<h2>Configuration saved</h2>";
  }  
  
  buffer +=
  "    <form action=\"/config\" method=\"GET\">"
  "      <table>"
  "        <tr>"
  "          <td>"
  "            <label for\"confUser\">Config Username</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"confUser\" id=\"confUser\" ";
  
  buffer += "    size=\"16\" ";
  buffer += "    value=\"";
  buffer += configBlock.confUser; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"confPasswd\">Config Password</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"confPasswd\" id=\"confPasswd\" ";
  
  buffer += "    size=\"16\" ";
  buffer += "    value=\"";
  buffer += configBlock.confPasswd; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"wifiSsid\">Wifi SSID</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"wifiSsid\" id=\"wifiSsid\" ";
  
  buffer += "    size=\"32\" ";
  buffer += "    value=\"";
  buffer += configBlock.wifiSsid; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"wifiKey\">Wifi Key</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"wifiKey\" id=\"wifiKey\" ";
  
  buffer += "    size=\"64\" ";
  buffer += "    value=\"";
  buffer += configBlock.wifiKey; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"mqttBroker\">MQTT Broker</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"mqttBroker\" id=\"mqttBroker\" ";
  
  buffer += "    size=\"32\" ";
  buffer += "    value=\"";
  buffer += configBlock.mqttBroker; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"mqttUser\">MQTT Username</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"mqttUser\" id=\"mqttUser\" ";
  
  buffer += "    size=\"32\" ";
  buffer += "    value=\"";
  buffer += configBlock.mqttUser; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"mqttPass\">MQTT Password</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"mqttPass\" id=\"mqttPass\" ";
  
  buffer += "    size=\"32\" ";
  buffer += "    value=\"";
  buffer += configBlock.mqttPass; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"mqttClientId\">MQTT ClientId</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"mqttClientId\" id=\"mqttClientId\" ";
  
  buffer += "    size=\"32\" ";
  buffer += "    value=\"";
  buffer += configBlock.mqttClientId; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"mqttPort\">MQTT Port</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"mqttPort\" id=\"mqttPort\" ";
  
  buffer += "    value=\""; 
  buffer += configBlock.mqttPort; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"mqttTopicLed1\">MQTT Topic LED 1</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"mqttTopicLed1\" id=\"mqttTopicLed1\" ";
  
  buffer += "    size=\"64\" ";
  buffer += "    value=\"";
  buffer += configBlock.mqttTopicLed1; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"mqttTopicLed2\">MQTT Topic LED 2</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"mqttTopicLed2\" id=\"mqttTopicLed2\" ";
  
  buffer += "    size=\"64\" ";
  buffer += "    value=\"";
  buffer += configBlock.mqttTopicLed2; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"mqttDebugTopic\">MQTT DebugTopic</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"mqttDebugTopic\" id=\"mqttDebugTopic\" ";
  
  buffer += "    size=\"64\" ";
  buffer += "    value=\"";
  buffer += configBlock.mqttDebugTopic; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td>"
  "            <label for\"debugMode\">DebugMode</label>"
  "          </td><td>"
  "            <input type=\"text\" name=\"debugMode\" id=\"debugMode\" ";
  
  buffer += "    value=\""; 
  buffer += configBlock.debugMode; 
  buffer += "\"";
  
  buffer +=
  "            />"
  "          </td>"
  "        </tr>"
  "        <tr>"
  "          <td colspan=\"2\">"
  "            <button type=\"submit\">Save</button>"
  "          </td>"
  "        </tr>"
  "      </table>"
  "    </form>"
  "  </body>"
  "</html>";

  webServer.send(200, "text/html", buffer);


#ifdef DEBUG
  Serial.println("indexHtml request served");
#endif    
}

void configServeGetConfiguration() {
  if (! checkAuthentication()) {
    return webServer.requestAuthentication();
  }  

  String arg;

  arg = webServer.arg("confUser");
  strcpy(configBlock.confUser, arg.c_str());
  arg = webServer.arg("confPasswd");
  strcpy(configBlock.confPasswd, arg.c_str());
  arg = webServer.arg("wifiSsid");
  strcpy(configBlock.wifiSsid, arg.c_str());
  arg = webServer.arg("wifiKey");
  strcpy(configBlock.wifiKey, arg.c_str());
  arg = webServer.arg("mqttBroker");
  strcpy(configBlock.mqttBroker, arg.c_str());
  arg = webServer.arg("mqttUser");
  strcpy(configBlock.mqttUser, arg.c_str());
  arg = webServer.arg("mqttPass");
  strcpy(configBlock.mqttPass, arg.c_str());
  arg = webServer.arg("mqttClientId");
  strcpy(configBlock.mqttClientId, arg.c_str());
  arg = webServer.arg("mqttPort");
  configBlock.mqttPort = atoi(arg.c_str());
  arg = webServer.arg("mqttTopicLed1");
  strcpy(configBlock.mqttTopicLed1, arg.c_str());
  arg = webServer.arg("mqttTopicLed2");
  strcpy(configBlock.mqttTopicLed2, arg.c_str());
  arg = webServer.arg("mqttDebugTopic");
  strcpy(configBlock.mqttDebugTopic, arg.c_str());
  arg = webServer.arg("debugMode");
  configBlock.debugMode = atoi(arg.c_str());
  
  configBlock.magic = MAGIC;
  
  showConfiguration();
  
  EEPROM.begin(512);
  EEPROM.put(EEPROM_ADDR, configBlock);  
  EEPROM.commit();
  
  Serial.println("EEPROM saved");

  configSaved = true;
  webServer.sendHeader("Location", String("/"), true);
  webServer.send(302, "text/plain", "");
  //webServer.send(200, "text/html", "configuration saved");
}
  
void showConfiguration() {
  Serial.println("Configuration is");

  Serial.print("magic = <");
  Serial.print(configBlock.magic);
  Serial.println(">");
    
  Serial.print("confUser = <");
  Serial.print(configBlock.confUser);
  Serial.println(">");
    
  Serial.print("confPasswd = <");
  Serial.print(configBlock.confPasswd);
  Serial.println(">");
    
  Serial.print("wifiSsid = <");
  Serial.print(configBlock.wifiSsid);
  Serial.println(">");
    
  Serial.print("wifiKey = <");
  Serial.print(configBlock.wifiKey);
  Serial.println(">");
    
  Serial.print("mqttBroker = <");
  Serial.print(configBlock.mqttBroker);
  Serial.println(">");
    
  Serial.print("mqttUser = <");
  Serial.print(configBlock.mqttUser);
  Serial.println(">");
    
  Serial.print("mqttPass = <");
  Serial.print(configBlock.mqttPass);
  Serial.println(">");
    
  Serial.print("mqttClientId = <");
  Serial.print(configBlock.mqttClientId);
  Serial.println(">");
    
  Serial.print("mqttPort = <");
  Serial.print(configBlock.mqttPort);
  Serial.println(">");
    
  Serial.print("mqttTopicLed1 = <");
  Serial.print(configBlock.mqttTopicLed1);
  Serial.println(">");
    
  Serial.print("mqttTopicLed2 = <");
  Serial.print(configBlock.mqttTopicLed2);
  Serial.println(">");
    
  Serial.print("mqttDebugTopic = <");
  Serial.print(configBlock.mqttDebugTopic);
  Serial.println(">");
    
  Serial.print("debugMode = <");
  Serial.print(configBlock.debugMode);
  Serial.println(">");
    
  
  Serial.println("---");
}