// #include <WiFi.h>
 #include "LCD_1602_RUS.h"

// #define WIFI_SSID "Wokwi-GUEST"
// #define WIFI_PASS ""
// #define BOT_TOKEN "6040632807:AAG8QHmaDlHUFftx4ELtBQVsjANOX2Cpzrk"
// #define CHAT_ID "6164808768"

// #include <FastBot.h>

// FastBot bot(BOT_TOKEN);



// //===============================================================================
// int counter;                                  // Data counter
// int totalColumns = 16;                       // number of colums pixels on the LCD
// int totalRows = 2;                          // number of rows pixels on the LCD
// const int delayTime = 2000;                 // delay time on between each iteration
// const int scrolling_time = 250;           // Scrolling time of the test
// //LiquidCrystal_I2C lcd(0x27, totalColumns, totalRows);  // Define the lcd object from the liduidCrystal class
// LCD_1602_RUS lcd(0x27, totalColumns, totalRows);
// String staticMessage = "Телеграм бот";
// String scrollingMessage = "LCD1602!";


// //=============================================================================
// // The below function allow us to scroll a test and it is used to scroll the ouput of data of the sensor
// void scrollMessage(int row, String message, int delayTime, int totalColumns) {
//   for (int i = 0; i < totalColumns; i++) {
//     message = message;
//   }
//   message = message + "   ";
//   for (int position = 0; position < message.length(); position++) {
//     lcd.setCursor(0, row);
//     lcd.print(message.substring(position, position + totalColumns));
//     delay(delayTime);
//   }
// }
// //=================================================================================


// void setup() {
//   Serial.begin(9600);
//   lcd.init();
//   lcd.backlight();
//   Serial.print("Connecting to WiFi");
//   WiFi.begin("Wokwi-GUEST", "", 6);
//   while (WiFi.status() != WL_CONNECTED) {
//     delay(100);
//     Serial.print(".");
//   }
//   Serial.println(" Connected!");


//   // connectWiFi();
//   bot.setChatID(CHAT_ID);

//   // подключаем функцию-обработчик
//   bot.attach(newMsg);

//   // показать юзер меню (\t - горизонтальное разделение кнопок, \n - вертикальное
//   bot.showMenu("Menu1 \t Menu2 \t Menu3 \n Close");
//   lcd.print(staticMessage);      // print the static message
//   scrollMessage(1, scrollingMessage, scrolling_time, totalColumns);
// }

// // обработчик сообщений
// void newMsg(FB_msg& msg) {
//   if (msg.text == "Close") bot.closeMenu();
//   else Serial.println(msg.text);
//   lcd.clear();
//   delay(150);


//  // lcd.setCursor(0, 1);
//  // lcd.print(msg.text);
//   //delay(1000);
//   lcd.setCursor(0, 0);
//   lcd.print("от: " + msg.username);
//   delay(1000);
//   //lcd.clear();

//   // lcd.setCursor(0, 1);
//   // lcd.print(msg.text);
//   // delay(500);
//   lcd.setCursor(0, 1);
//   String scrollingMessageHumidity = msg.text;
//   scrollMessage(1, scrollingMessageHumidity, scrolling_time, totalColumns);
//   lcd.clear();
//   // Print he values of Temperature in Celsus
//   // String scrollingMessageTemperature = msg.text;
//   // scrollMessage(1, scrollingMessageTemperature, scrolling_time, totalColumns);
//   // Print the values of temperature in Fahrenheit
//   // String scrollingMessageTemperatureFahrenheit = msg.text;
//   // scrollMessage(1, scrollingMessageTemperatureFahrenheit, scrolling_time, totalColumns);
//   // // Распечатайте значения индекса тепла для обеих единиц.
//   // String scrollingMessageHeatIndexCelsus = msg.text;
//   // scrollMessage(1, scrollingMessageHeatIndexCelsus, scrolling_time, totalColumns);
//   // String scrollingMessageHeatIndexFahrenheit = msg.text;
//   // scrollMessage(1, scrollingMessageHeatIndexFahrenheit, scrolling_time, totalColumns);
//   delay(delayTime);
//   counter++;  // update the counbter
// }

// void loop() {
//   bot.tick();   // тикаем в луп
//   Serial.print(bot.tick());


// }


// void connectWiFi() {
//   delay(2000);
//   Serial.begin(115200);
//   Serial.println();

//   WiFi.begin(WIFI_SSID, WIFI_PASS);
//   while (WiFi.status() != WL_CONNECTED) {
//     delay(500);
//     Serial.print(".");
//     // if (millis() > 15000) ESP.restart();
//   }
//   Serial.println("Connected");
// }



// // // /* Hello Wokwi! */

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

// // // LiquidCrystal_I2C lcd(0x27, 20, 4);

// // // void setup() {
// // //   lcd.init();
// // //   lcd.backlight();
// // //   lcd.setCursor(1, 0);
// // //   lcd.print("Hello, Wokwi!");
// // // }

// // // void loop() {
// // //   lcd.setCursor(7, 1);
// // //   lcd.print(millis() / 1000);
// // // }



// // #include "LCD_1602_RUS.h"


// // LCD_1602_RUS lcd(0x27, 16, 2);

// // void setup()
// // {
// //   lcd.init();                      // initialize the lcd
// //   // Print a message to the LCD.
// //   lcd.backlight();
// //   lcd.setCursor(2, 0);
// //   lcd.print(L"Теперь можно");
// //   lcd.setCursor(3, 1);
// //   lcd.print(L"по-русски");

// // }

// // void loop()
// // {
// // }


#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

LCD_1602_RUS 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 = 100; // 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_static = bot.messages[i].from_name;
      //if (from_name == "")
        //from_name = "Guest";

      if (text == "/start")
      {
        String welcome = "Welcome " + from_name_static + ".";
        welcome += "Just";
        bot.sendMessage(chat_id, welcome, "Markdown");
      }
      else
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(from_name_static);
        
        // Проверяем, изменился ли текст сообщения
        if (text.length() > lcdColumns) {
          // Если текст длиннее, чем экран, прокручиваем его
          for (int j = 0; j < text.length() - lcdColumns + 1; j++) {
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print(from_name_static);
            lcd.setCursor(0, 1);
            lcd.print(text.substring(j, j + lcdColumns));
            delay(300); // Задержка для прокрутки
          }
        } else {
          lcd.setCursor(0, 0);
          lcd.print(from_name_static);
          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();
  }
}