/*********
  Diyusthad
  Complete project details at https://diyusthad.com
*********/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;

#define SDA 13                    //Define SDA pins
#define SCL 14                    //Define SCL pins

LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
// если вы не знаете адрес I2C вашего дисплея, запустите скетч сканера I2C 
// установите адрес ЖК-дисплея, количество столбцов и строк

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

// Wifi network station credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "6040632807:AAG8QHmaDlHUFftx4ELtBQVsjANOX2Cpzrk"
#define CHAT_ID "6164808768"

const unsigned long BOT_MTBS = 1000; // mean time between scan messages

WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lasttime; // last time messages' scan has been done

void handleNewMessages(int numNewMessages)
{
  Serial.print("handleNewMessages ");
  Serial.println(numNewMessages);

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = String(bot.messages[i].chat_id);
    if (chat_id != CHAT_ID )
    {
      bot.sendMessage(chat_id, "Unauthorized user", "");
    }
    else
    {
      String text = bot.messages[i].text;

      String from_name = bot.messages[i].from_name;
      if (from_name == "")
        from_name = "Guest";

      if (text == "/start")
      {
        String welcome = "Welcome" + from_name + ".";
        welcome += "Just";
        bot.sendMessage(chat_id, welcome, "Markdown");
      }
      else
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(from_name);
        lcd.setCursor(0, 1);
        lcd.print(text);
      }
    }
  }
}

void setup() {
  // initialize LCD
  lcd.init();
  // turn on LCD backlight
  lcd.backlight();
  
  Wire.begin(SDA, SCL);           // attach the IIC pin

  Serial.begin(115200);
  Serial.println();

  // attempt to connect to Wifi network:
  Serial.print("Connecting to Wifi SSID ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(100);
  }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

}

void loop() {

  if (millis() - bot_lasttime > BOT_MTBS)
  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    bot_lasttime = millis();
  }
}



// // Learn about the ESP32 WiFi simulation in
// // https://docs.wokwi.com/guides/esp32-wifi

// #include <WiFi.h>
// #include <Wire.h>
// #include <LiquidCrystal_I2C.h>

// LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);

// #define NTP_SERVER     "pool.ntp.org"
// #define UTC_OFFSET     0
// #define UTC_OFFSET_DST 0

// void spinner() {
//   static int8_t counter = 0;
//   const char* glyphs = "\xa1\xa5\xdb";
//   LCD.setCursor(15, 1);
//   LCD.print(glyphs[counter++]);
//   if (counter == strlen(glyphs)) {
//     counter = 0;
//   }
// }

// void printLocalTime() {
//   struct tm timeinfo;
//   if (!getLocalTime(&timeinfo)) {
//     LCD.setCursor(0, 1);
//     LCD.println("Connection Err");
//     return;
//   }

//   LCD.setCursor(8, 0);
//   LCD.println(&timeinfo, "%H:%M:%S");

//   LCD.setCursor(0, 1);
//   LCD.println(&timeinfo, "%d/%m/%Y   %Z");
// }

// void setup() {
//   Serial.begin(115200);

//   LCD.init();
//   LCD.backlight();
//   LCD.setCursor(0, 0);
//   LCD.print("Connecting to ");
//   LCD.setCursor(0, 1);
//   LCD.print("WiFi ");

//   WiFi.begin("Wokwi-GUEST", "", 6);
//   while (WiFi.status() != WL_CONNECTED) {
//     delay(250);
//     spinner();
//   }

//   Serial.println("");
//   Serial.println("WiFi connected");
//   Serial.print("IP address: ");
//   Serial.println(WiFi.localIP());

//   LCD.clear();
//   LCD.setCursor(0, 0);
//   LCD.println("Online");
//   LCD.setCursor(0, 1);
//   LCD.println("Updating time...");

//   configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
// }

// void loop() {
//   printLocalTime();
//   delay(250);
// }