#include <PubSubClient.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include <DHTesp.h>

#define DHTPIN 12
#define LED_BUILTIN 2

DHTesp dhtSensor;

WiFiClient espClient;
PubSubClient mqttClient(espClient);

long lastMsg = 0;

const char* mqtt_topic = "MMT-TEST"; 

void setup() {

  dhtSensor.setup(DHTPIN, DHTesp::DHT22);

  Serial.begin(115200);
  setupWifi();
  setupMqtt();
  
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  
}

void loop() {
  if (!mqttClient.connected()) {
  connectToBroker();
}

  StaticJsonDocument<80> doc;
  char output[80];

  long now = millis();
  if (now - lastMsg > 5000) {
    lastMsg = now;

    TempAndHumidity data = dhtSensor.getTempAndHumidity();

    float temperature = data.temperature;
    float humidity = data.humidity;
    
    
    doc["t"] = temperature;
    doc["h"] = humidity;


    serializeJson(doc, output);
    Serial.println(output);
    
    mqttClient.loop();
    mqttClient.publish("MMT-TEMP", output); 
    delay(1000);
  }
}

void setupWifi() {
  WiFi.begin("Wokwi-GUEST", "");

  while (WiFi.status() != WL_CONNECTED) { 
    delay(500);
    Serial.print(".");
  }

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

void setupMqtt(){
  mqttClient.setServer("test.mosquitto.org", 1883);
  mqttClient.setCallback(receiveCallback);
}

void connectToBroker() {
  while (!mqttClient.connected()) {
    Serial.print("Attempting MQTT connection...");
    if(mqttClient.connect("ESP32-4654564645645")){
      Serial.println("connected");
      mqttClient.subscribe(mqtt_topic);    
  } else {
    Serial.print("failed ");
    Serial.print(mqttClient.state());
    delay(5000);
    }
  }
}

void receiveCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("]: ");

  char payloadCharAr[length];
  for (unsigned int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    payloadCharAr[i] = (char)payload[i];
  }
  Serial.println();

  if(strcmp(topic, "MMT-TEST") == 0){
    if(payloadCharAr[0] == '1'){
      digitalWrite(LED_BUILTIN, HIGH);
    }else{
      digitalWrite(LED_BUILTIN, LOW);
    }
  }
}