#include <DHT.h>
#include <DHT_U.h>

#include <UniversalTelegramBot.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>


#define WIFI_SSID "ICOMP_1A"
#define WIFI_PASSWORD "1comp@14#"
#define BOTtoken "5541604655:AAFabyOyM-QAAz9H6Mq676UALR2C-3kRVjw"

#define LED_PIN 32
#define DHT_PIN 23
#define DHTTYPE DHT11

#define BOT_SCAN 1000
long lastTimeScan;
bool ledStatus;
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
DHT dht(DHT_PIN, DHTTYPE);

void handleNewMessages(int numNewMessages) {
float humidity, temperature;
String message, chat_id, text, from_name;

for (int i=0; i<numNewMessages; i++) {
  chat_id = String(bot.messages[i].chat_id);
  from_name = bot.messages[i].from_name;
  text = bot.messages[i].text;
  Serial.println(text);
  if (text == "/ledon") {
    digitalWrite(LED_PIN, HIGH);
    ledStatus = true;
    bot.sendMessage(chat_id, "Led está ligado", "");
    Serial.println("Led esta ligado");
  }
  
  if (text == "/ledoff") {
    ledStatus = false;
    digitalWrite(LED_PIN, LOW);
    bot.sendMessage(chat_id, "Led está desligado", "");
    Serial.println("Led esta desligado");
  }
  if( text == "/env") {
    humidity = dht.readHumidity();
    temperature = dht.readTemperature();
    message = "A temperatura é de " + String(temperature, 2) + "graus celsius.\n";
    message += "A umidade relativa do ar é de " + String(humidity,2)+ "%.\n";
    bot.sendMessage(chat_id, message, "Markdown");
    Serial.println(message);
  }
  
  if (text == "/status") {
    String message = "Led está ";
    if(ledStatus){
      message += "ligado";
    }else{
      message += "desligado";
    }
    message += ". \n";
    humidity = dht.readHumidity();
    temperature = dht.readTemperature();
    message += "A temperatura é de " + String(temperature, 2) + "graus celsius.\n";
    message += "A umidade relativa do ar é de " + String(humidity,2)+ "%.\n";
    bot.sendMessage(chat_id, message, "");
    Serial.println(message);
  }
  
  if (text == "/start") {
    String welcome = from_name + ", bem vindo ao Bot do DevTitans do Barreto.\n";
    welcome += "Para interagir, use um dos comandos a seguir.\n"; 
    welcome += "/ledon : para ligar o Led \n";
    welcome += "/ledoff : para desligar o Led \n";
    welcome += "/env : saber a temperatura e umidade do ambiente \n";
    welcome += "/status : para saber o status dos sensores e atuadores \n";
    
    bot.sendMessage(chat_id, welcome, "");
    }    
  }
}


void setupWifi(){
Serial.print("Connecting Wifi: ");
Serial.println(WIFI_SSID);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
}


void setupPins(){
pinMode(LED_PIN, OUTPUT);
pinMode(DHT_PIN, INPUT_PULLUP);
digitalWrite(LED_PIN, LOW);
ledStatus = false;
dht.begin();
}


void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
setupWifi();
setupPins();
lastTimeScan = millis();
}

void loop() {
if (millis() > lastTimeScan + BOT_SCAN) {
int numNewMessages = bot.getUpdates (bot.last_message_received

+ 1);
while(numNewMessages) {
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received

+ 1);

}
lastTimeScan = millis();
}
}