#include <FS.h>
#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
#include <ArduinoJson.h>          //https://github.com/bblanchon/ArduinoJson

//needed for library
#include <ESP8266WebServer.h>
#include <DNSServer.h>

#define DEBUG 0 //0=off 1=on

// Variables
const char* set_mqtt_user="64x35up";
const char* set_mqtt_devid="1330";

// Default configuration values
char mqtt_user[9]; //le va lua din FS
char mqtt_devid[5]; //le va lua din FS

// Function Prototypes
bool readConfigFile();
bool writeConfigFile();

// Setup function
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  #if DEBUG
  Serial.println("\n Starting");
  #endif 

  // Mount the filesystem
  bool result = SPIFFS.begin();
  //Serial.println("SPIFFS opened: " + result);

  if (readConfigFile()) {
    #if DEBUG
    Serial.print("User:");
    Serial.println(mqtt_user);
    Serial.print("devid:");
    Serial.println(mqtt_devid);
    #endif
  }
  //WiFi.printDiag(Serial); //Remove this line if you do not want to see WiFi password printed

}

// Loop function

void loop() {
  // is configuration portal requested?
    writeConfigFile();
    delay(9999999);
}

bool readConfigFile() {
  // this opens the config file in read-mode
  File f = SPIFFS.open("/config.json", "r");
  
  if (!f) {
    #if DEBUG
    Serial.println("Configuration file not found");
    #endif
    return false;
  } else {
    // we could open the file
    size_t size = f.size();
    // Allocate a buffer to store contents of the file.
    std::unique_ptr<char[]> buf(new char[size]);

    // Read and store file contents in buf
    f.readBytes(buf.get(), size);
    // Closing file
    f.close();
    // Using dynamic JSON buffer which is not the recommended memory model, but anyway
    // See https://github.com/bblanchon/ArduinoJson/wiki/Memory%20model
    DynamicJsonBuffer jsonBuffer;
    // Parse JSON string
    JsonObject& json = jsonBuffer.parseObject(buf.get());
    // Test if parsing succeeds.
    if (!json.success()) {
      #if DEBUG
      Serial.println("JSON parseObject() failed");
      #endif
      return false;
    }
    #if DEBUG
    json.printTo(Serial);
    #endif
    strcpy(mqtt_user, json["mqtt_user"]);
    strcpy(mqtt_devid, json["mqtt_devid"]);
  }
  return true;
}

bool writeConfigFile() {
  #if DEBUG
  Serial.println("Saving config file");
  #endif
  DynamicJsonBuffer jsonBuffer;
  JsonObject& json = jsonBuffer.createObject();

  // JSONify local configuration parameters
  json["mqtt_user"] = set_mqtt_user;
  json["mqtt_devid"] = set_mqtt_devid;

  // Open file for writing
  File f = SPIFFS.open("/config.json", "w");
  if (!f) {
    Serial.println("Instalation failed! Write error!");
    while (true){
      digitalWrite(LED_BUILTIN, HIGH);   // ledul face blink semn ca sunt probleme
      delay(400);                       
      digitalWrite(LED_BUILTIN, LOW);   
      delay(400);                       
    }
    return false;
  }

  json.prettyPrintTo(Serial);
  // Write data to file and close it
  json.printTo(f);
  f.close();

  Serial.println("\nDevice updated!");
  digitalWrite(LED_BUILTIN, LOW); // ledul ramane aprins semn ca s-au scris credentialele
  return true;
}