#include <WiFi.h>
#include <MQTTPubSubClient.h>

WiFiClient client;
MQTTPubSubClient mqtt;

void connect() {
  connect_to_wifi:
    Serial.print("connecting to wifi...");
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(1000);
    }
    Serial.println(" connected!");

  connect_to_host:
    Serial.print("connecting to host...");
    client.stop();
    while (!client.connect("mqtt.eclipseprojects.io", 1883)) {//while (!client.connect("public.cloud.shiftr.io", 1883)) {
        Serial.print(".");
        delay(1000);
        if (WiFi.status() != WL_CONNECTED) {
            Serial.println("WiFi disconnected");
            goto connect_to_wifi;
        }
    }
    Serial.println(" connected!");

    Serial.print("connecting to mqtt broker...");
    mqtt.disconnect();
    while (!mqtt.connect("arduino", "public", "public")) {
        Serial.print(".");
        delay(1000);
        if (WiFi.status() != WL_CONNECTED) {
            Serial.println("WiFi disconnected");
            goto connect_to_wifi;
        }
        if (client.connected() != 1) {
            Serial.println("WiFiClient disconnected");
            goto connect_to_host;
        }
    }
    Serial.println(" connected!");
}

void setup() {
    Serial.begin(115200);
    WiFi.begin("Wokwi-GUEST", "", 6);
    mqtt.begin(client);
    connect();

    mqtt.subscribe([](const String& topic, const String& payload, const size_t size) {
        Serial.println("mqtt received: " + topic + " - " + payload);
    });

    mqtt.subscribe("app/mqtt/status/#", [](const String& payload, const size_t size) {
        Serial.print("app/mqtt/status/# ");
        Serial.println(payload);
    });
}
int count;
void loop() {
    mqtt.update();

    if (!mqtt.isConnected()) {
        connect();
    }

    // publish message
    static uint32_t prev_ms = millis();
    if (millis() > prev_ms + 500) {
        prev_ms = millis();
        count ++;
        char cstr[sizeof(count)];
        itoa(count, cstr, 10);
        mqtt.publish("app/mqtt/status/millis", cstr);
    }
}