#include <WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

   // WiFi credentials
const char *ssid = "Wokwi-GUEST";
const char *password = "";

   // Adafruit IO credentials
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME "anilvhatkar"
#define AIO_KEY "aio_sfab64Ct2obkeuRaIDbB9yO5aLkN"

// Store the MQTT server, username, and password in flash memory.
// This is required for using the Adafruit MQTT library.
const char MQTT_SERVER[] PROGMEM    = AIO_SERVER;
const char MQTT_USERNAME[] PROGMEM  = AIO_USERNAME;
const char MQTT_PASSWORD[] PROGMEM  = AIO_KEY;

const char LED_FEED[] PROGMEM = AIO_USERNAME "/feeds/led";
 
#define ledPin 14

// Create a WiFiClient object
WiFiClient wifiClient;

// Define the Adafruit IO Feed
Adafruit_MQTT_Client mqtt(&wifiClient, AIO_SERVER , AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe feed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/led");

void setup() {
  Serial.begin(9600);
   Serial.print("Connecting to WiFi");
  WiFi.begin(ssid,password, 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }
  Serial.println(" Connected!");
  // Connect to Adafruit IO
  mqtt.subscribe(&feed);
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,HIGH);
}

void loop() {
  // Ensure the connection to Adafruit IO is maintained
  if (!mqtt.connected()) {
    connectToMQTT();
  }
 
  // Monitor the Adafruit IO feed
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
    if (subscription == &feed) {
      Serial.print(F("Got: "));
      Serial.println((char *)feed.lastread);
      String data = (char *) feed.lastread;
      Serial.print("data :");
      Serial.println(data);
      if (data == "1")
      {
        digitalWrite(ledPin,HIGH);
      }
      else if (data == "0")
      {
        digitalWrite(ledPin,LOW);
      }
    }
  }
}


void connectToMQTT() {
int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);  // wait 5 seconds
  }
  Serial.println("MQTT Connected!");
}