#include <ArduinoJson.h>
#include "CTBot.h"

CTBot     myBot;
TBMessage msg;

const String ssid = "Wokwi-GUEST";
const String pass = "";

String token  = "5974586883:AAG0hAQa17biKIgI1FNPDj5yEsZp5DOuWpc"; // Token API Telegram Bot
const int id  = 6001135119;                                       // ChatID

const int moisturePin     = A0;   // A0
const int pumpPin         = 1;    // D1
const int dryThreshold    = 300;  
const int wetThreshold    = 500;  
const int stabilityDelay  = 100;

int moistureValue;

void setup() 
{
  Serial.begin(9600);
  pinMode(pumpPin, OUTPUT);
  delay(500);

  Serial.println("Starting System...");

  Serial.println("Conneting to Network...");
  myBot.wifiConnect(ssid, pass);
  Serial.println("Conneted");

  myBot.setTelegramToken(token);
  Serial.println("Connecting to Telegram Bot...");
  if (myBot.testConnection()) 
  {
    Serial.println("TeleBot Connected");
  } 
  else 
  {
    Serial.println("TeleBot Failed");
  }

  if (msg.text.equalsIgnoreCase("/Start")) 
  {
     String welcome = "Welcome to Selada Otomatis System.\n\n";
     welcome       += "Sistem ini digunakan untuk monitoring Kondisi Tanah dan Menyalakan Pompa.\n";
     welcome       += "-----------------------------------------\n";
     welcome       += "List Action\n";
     welcome       += "/Help   : untuk melihat list \n";
     welcome       += "/Status : untuk Status Tanah \n";
     welcome       += "/On     : untuk Menyalakan Pompa \n";
     welcome       += "/Off    : untuk Mematikan Pompa \n";
     welcome       += "/Reset  : untuk Reset Program \n";
     welcome       += "-----------------------------------------\n";
     myBot.sendMessage(msg.sender.id, welcome);
  }

  moistureValue = analogRead(moisturePin);
  Serial.print("Initial moisture level: ");
  Serial.println(moistureValue);
}

void loop() 
{ 
  moistureValue = analogRead(moisturePin);

  if (moistureValue <= wetThreshold) 
  {
    digitalWrite(pumpPin, LOW);
    Serial.println("Moisture level: Wet");
    myBot.sendMessage(msg.sender.id, "Moisture level: Wet");
  } 
  else if (moistureValue >= dryThreshold) 
  {
    digitalWrite(pumpPin, HIGH);
    Serial.println("Moisture level: Dry");
    myBot.sendMessage(msg.sender.id, "Moisture level: Dry");
  }

  if (CTBotMessageText == myBot.getNewMessage(msg)) 
   {
    Serial.print("Pesan Masuk: ");
    Serial.println(msg.text);

    if (msg.text.equalsIgnoreCase("/Help")) 
    {
      String list  = "Action Salah\n";
      list        += "-----------------------------------------\n";
      list        += "List Action\n";
      list        += "/Help   : untuk melihat list \n";
      list        += "/Start  : untuk Welcome Page \n";
      list        += "/Status : untuk Status Tanah \n";
      list        += "/On     : untuk Menyalakan Pompa \n";
      list        += "/Off    : untuk Mematikan Pompa \n";
      list        += "/Reset  : untuk Reset Program \n";
      list        += "-----------------------------------------\n";
      myBot.sendMessage(msg.sender.id, list);
    }

    else if (msg.text.equalsIgnoreCase("/Start")) 
    {
      String welcome = "Welcome to Selada Otomatis System.\n\n";
      welcome       += "Sistem ini digunakan untuk monitoring Kondisi Tanah dan Menyalakan Pompa.\n";
      welcome       += "-----------------------------------------\n";
      welcome       += "List Action\n";
      welcome       += "/Help   : untuk melihat list \n";
      welcome       += "/Status : untuk Status Tanah \n";
      welcome       += "/On     : untuk Menyalakan Pompa \n";
      welcome       += "/Off    : untuk Mematikan Pompa \n";
      welcome       += "/Reset  : untuk Reset Program \n";
      welcome       += "-----------------------------------------\n";
      myBot.sendMessage(msg.sender.id, welcome);
    }

    else if (msg.text.equalsIgnoreCase("/Status")) 
    {
      String sensor = "Moisture Level : ";
      sensor       += moistureValue;
      myBot.sendMessage(msg.sender.id, sensor);
    }

    else if (msg.text.equalsIgnoreCase("/On")) 
    {
      digitalWrite(pumpPin, LOW);
      myBot.sendMessage(msg.sender.id, "Status Pompa ON");
    }

    else if (msg.text.equalsIgnoreCase("/Off")) 
    {
      digitalWrite(pumpPin, HIGH);
      myBot.sendMessage(msg.sender.id, "Status Pompa OFF");
    }

    else if (msg.text.equalsIgnoreCase("/Reset")) 
    {
      myBot.sendMessage(msg.sender.id, "Reset");
      setup();
    }

    else 
    {
      String list  = "Action Salah\n";
      list        += "-----------------------------------------\n";
      list        += "List Action\n";
      list        += "/Help   : untuk melihat list \n";
      list        += "/Status : untuk Status Tanah \n";
      list        += "/On     : untuk Menyalakan Pompa \n";
      list        += "/Off    : untuk Mematikan Pompa \n";
      list        += "/Reset  : untuk Reset Program \n";
      list        += "-----------------------------------------\n";
      myBot.sendMessage(msg.sender.id, list);
      Serial.println("Perintah Salah");
    }
  }
  delay(stabilityDelay);
}