/*
 * To upload through terminal you can use: curl -F "image=@firmware.bin" http://<ip>:8080/update
 *
 *
 * bin file location on windows: C:\Users\<your username>\AppData\Local\Temp\arduino_build_<id>
 */

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>

#include <WiFiClient.h>
#include <WiFiManager.h>         // WiFiManager from bib manager

#include "config.h"
#include "config_user.h"

ESP8266WebServer httpServer(WEB_UPDATER_HTTP_PORT);
ESP8266HTTPUpdateServer httpUpdater;

String _webUpdater_ip = "127.0.0.1";
String _webUpdater_dev = "unknown";
float  _webUpdater_sensValues[VALUES];

String hb_ws_msg_start     = "{";
String hb_ws_msg_temp      = "\"temperature\": ";
String hb_ws_msg_humi      = "\"humidity\": ";
String hb_ws_msg_light     = "\"lightlevel\": ";
String hb_ws_msg_windspeed = "\"windspeed\": ";
String hb_ws_msg_pressure  = "\"pressure\": ";
String hb_ws_msg_timestamp = "\"timestamp\": ";
String hb_ws_msg_end       = "}";

void setupWebUpdater(String device, String ip)
{
  debug("Starting WebUpdater... " + ip);
  _webUpdater_ip = ip;
  _webUpdater_dev = device;

  httpUpdater.setup(&httpServer);

  httpServer.on("/", showHTMLMain);
  httpServer.on("/resetWifiManager", resetWifiManager);
#ifdef HOMEBRIDGE_WEBSTAT
  httpServer.on("/hbWebstat", hb_webstat_send);
#endif

  httpServer.begin();

  debug("HTTPUpdateServer ready!");
}

void doWebUpdater(void)
{
  digitalWrite(D0, HIGH);
  httpServer.handleClient();
}

void setSensorData(float sensorValues[])
{
  for (uint8_t i = 0; i < VALUES; i++) {
    _webUpdater_sensValues[i] = sensorValues[i];
  }
}

void showHTMLMain(void)
{
  String message = "<html><head><title>OKO Weatherstation - " + String(_webUpdater_dev) + "</title>"
"<meta http-equiv=\"refresh\" content=\"20\">"
"</head><body>"
"<br><a href=\"http://" + _webUpdater_ip + ":8080/update\">firmware update</a><br><br>"
"<table>"
"<tr><td>temperature</td><td>" + String(_webUpdater_sensValues[SENSOR_TEMPERATURE]) + "</td></tr>"
"<tr><td>humidity</td><td>" + String(_webUpdater_sensValues[SENSOR_HUMIDITY]) + "</td></tr>"
"<tr><td>light</td><td>" + String(_webUpdater_sensValues[SENSOR_LIGHT]) + "</td></tr>"
"<tr><td>windspeed</td><td>" + String(_webUpdater_sensValues[SENSOR_WINDSPEED]) + "</td></tr>"
"<tr><td>pressure</td><td>" + String(_webUpdater_sensValues[SENSOR_PRESSURE]) + "</td></tr>"
"<tr><td>batvoltage</td><td>" + String(_webUpdater_sensValues[SENSOR_BAT_VOLTAGE]) + "</td></tr>"
"</table>"
"</body></html>";

  httpServer.send(200, "text/html", message);
}

void hb_webstat_send(void)
{
  unsigned int timestamp = 0;
  for (int i = 0; i < VALUES; i++)
  {
    timestamp += int(_webUpdater_sensValues[i]) + millis();
  }
  String msg = hb_ws_msg_start +
               hb_ws_msg_temp +
               String(_webUpdater_sensValues[SENSOR_TEMPERATURE], 2) +
               ", " +
               hb_ws_msg_humi +
               String(_webUpdater_sensValues[SENSOR_HUMIDITY], 2) +
               ", " +
               hb_ws_msg_light +
               String(_webUpdater_sensValues[SENSOR_LIGHT], 0) + // The light level for the homebridge-http-lux2 plugin is only able to parse integer values
               ", " +
               hb_ws_msg_windspeed +
               String(_webUpdater_sensValues[SENSOR_WINDSPEED], 2) +
               ", " +
               hb_ws_msg_pressure +
               String(_webUpdater_sensValues[SENSOR_PRESSURE], 2) +
               ", " +
               hb_ws_msg_timestamp +
               String(timestamp) +
               hb_ws_msg_end;

  httpServer.send(200, "text/html", msg);
}

void resetWifiManager()
{

  String message = "<html><head><title>OKO Weatherstation - " + String(_webUpdater_dev) + "</title>"
"<meta http-equiv=\"refresh\" content=\"20\">"
"</head><body>"
"Reset WifiManager config.<br>"
"Rebooting...<br>"
"</body></html>";

  httpServer.send(200, "text/html", message);

  // Erase WiFi Credentials, enable, compile, flash, disable and reflash.
  WiFiManager wifiManager;
  wifiManager.resetSettings();

  delay(5000);

  // manual reset after restart is required
  ESP.restart();
}
