//https://circuits4you.com/2019/01/11/nodemcu-esp8266-arduino-json-parsing-example/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>

#define D5 14 //Blue
#define D5 14 //Red
#define D5 14 //Green

const char* SSID = "IFSC";
const char* PASSWORD = "campuschapeco";

String BASE_URL = "http://www.projeto8.migueldebarba.com.br/testejson.php";

String payload;
void initSerial();
void initWiFi();
void httpRequest(String path);

// ############### OBJECTS ################# //

WiFiClient client;
HTTPClient http;
void setup() {
  initSerial();
  initWiFi();
  pinMode(D5, OUTPUT);
  pinMode(D6, OUTPUT);
  pinMode(D7, OUTPUT);
}

// ############# HTTP REQUEST ################ //

void httpRequest(String path)
{
  String payload = makeRequest(path);
  if (!payload) {
    return;
  }
}

String makeRequest(String path)
{
  http.begin(client, BASE_URL);
  int httpCode = http.GET();                                  //Send the request
    if (httpCode > 0) { //Check the returning code
      payload = http.getString();   //Get the request response payload
    }

  if (httpCode < 0) {
    Serial.println("request error - " + httpCode);
    return "";
  }
  if (httpCode != HTTP_CODE_OK) {
    return "";
  }
  String response =  http.getString();
  http.end();
  return response;
}

// implementacao dos prototypes

void initSerial() {
  Serial.begin(115200);
}

void initWiFi() {
  delay(10);
  Serial.println("Conectando-se em: " + String(SSID));

  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Conectado na Rede " + String(SSID) + " | IP => ");
  Serial.println(WiFi.localIP());
}



void loop() {
  Serial.println("[GET] /testejason.php");
  Serial.println("");
  httpRequest("GET");
  Serial.println("payload:  " + payload);

  // Cria documento JSON (buffer)
  StaticJsonDocument<300> doc;
  // Desserializa
  DeserializationError error = deserializeJson(doc, payload);

  if (error) {
    Serial.print(F("Erro ao desserializar: "));
    Serial.println(error.f_str());
    return;
  }  

  // Como Ã© um array, pegamos o primeiro elemento
  JsonObject painel = doc[0];

  // Acessa os campos
  int idpainel = painel["idpainel"];
  const char* mac = painel["mac_idmac"];
  const char* nome = painel["nome"];
  int ledr = painel["ledr"];
  int ledg = painel["ledg"];
  int ledb = painel["ledb"];
  analogWrite(D6,ledr);
  analogWrite(D7,ledg);
  analogWrite(D5,ledb);

  // Mostra no Serial
  Serial.println("=== Dados do Painel ===");
  Serial.print("ID: ");
  Serial.println(idpainel);
  Serial.print("MAC: ");
  Serial.println(mac);
  Serial.print("Nome: ");
  Serial.println(nome);
  Serial.print("LED R: ");
  Serial.println(ledr);
  Serial.print("LED G: ");
  Serial.println(ledg);
  Serial.print("LED B: ");
  Serial.println(ledb);  
  delay(10000);
}