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

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

// Konfigurasi MQTT
const char* mqtt_server = "broker.emqx.io"; // Broker MQTT
const int mqtt_port = 1883;                // Port MQTT
const char* mqtt_topic = "MET01-000007";        // Topik untuk mengirim data

WiFiClient espClient;
PubSubClient client(espClient);

// Data multiple sensor
float pressure = random(0, 10);
float stand = 50;

// Variabel waktu untuk logika penambahan nilai
unsigned long previousMillis = 0;       // Variabel untuk melacak waktu sebelumnya
const unsigned long interval = 1000;    // Interval 1 detik (1000 ms)
const unsigned long sendInterval = 30000; // Interval pengiriman data ke broker MQTT 30 detik
unsigned long lastSendMillis = 0;       // Waktu terakhir data dikirim

void setup_wifi() {
  delay(500);
  Serial.println();
  Serial.print("Menghubungkan ke ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

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

  Serial.println();
  Serial.println("WiFi terhubung");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());
}

// void reconnect() {
//   // Loop hingga terkoneksi kembali ke broker MQTT
//   if (!client.connected()) {
//     Serial.print("Menghubungkan ke broker MQTT...");
//     if (client.connect("ESP8266Client3")) {  // ID klien unik
//       Serial.println("Terhubung");
//     } else {
//       Serial.print("Gagal, rc=");
//       Serial.print(client.state());
//       Serial.println(" Coba lagi dalam 5 detik");
//       delay(5000);
//     }
//   }
// }

void reconnect() {
  static unsigned long lastReconnectAttempt = 0;
  unsigned long now = millis();
  if (!client.connected()) {
    if (now - lastReconnectAttempt > 5000) { // Coba reconnect setiap 5 detik
      lastReconnectAttempt = now;
      Serial.print("Menghubungkan ke broker MQTT...");
      if (client.connect("ESP8266Client3")) {
        Serial.println("Terhubung");
      } else {
        Serial.print("Gagal, rc=");
        Serial.print(client.state());
        Serial.println(" Coba lagi nanti...");
      }
    }
  }
}



void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
}

void loop() {
  if (!client.connected()) {
    reconnect();  // Hanya panggil reconnect jika tidak terhubung
  } else {
    client.loop();  // Jalankan loop MQTT saat sudah terhubung
  }

  unsigned long currentMillis = millis();  // Ambil waktu saat ini

  // Logika penambahan nilai stand setiap detik
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    stand++;  // Tingkatkan nilai stand
  }

  // Kirim data setiap 30 detik
  if (currentMillis - lastSendMillis >= sendInterval) {
    lastSendMillis = currentMillis;

    // Membuat JSON untuk data sensor
    StaticJsonDocument<200> jsonDoc;
    jsonDoc["stand"] = stand;
    jsonDoc["pressure"] = pressure;

    // Konversi JSON ke string
    char jsonBuffer[512];
    serializeJson(jsonDoc, jsonBuffer);

    // Publish data JSON ke broker MQTT
    if (client.connected()) {
      client.publish(mqtt_topic, jsonBuffer);
      Serial.println("Data dikirim: ");
      Serial.println(jsonBuffer);
    } else {
      Serial.println("Koneksi MQTT terputus, data tidak dikirim.");
    }

    // Cetak nilai stand
    Serial.print("Nilai stand terkini: ");
    Serial.println(stand);
  }
}