#include "LCD_1602_RUS.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// set the LCD number of columns and rows
int lcdColumns = 20;
int lcdRows = 4;

#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(150); // Задержка для прокрутки
          }
        } 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();
  }
}