#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>
#include <WiFiClient.h>

#include "settings.h"

WiFiClient espClient;
PubSubClient mqttClient(espClient);

void setup()
{
  // Initialize pins
  pinMode(LED_BUILTIN, OUTPUT); // Inverted on Wemos D1 Mini
  digitalWrite(LED_BUILTIN, LOW);

  Serial.begin(BAUD_RATE, SERIAL_8N1, SERIAL_RX_ONLY, 3, true);

  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    blinkLed(20, 50); // Blink fast to indicate no WiFi connection
    delay(500);
  }

  setupOTA();
  setupDataReadout();

  mqttClient.setServer(MQTT_HOST, atoi(MQTT_PORT));
  blinkLed(5, 500); // Blink 5 times to indicate end of setup
}

void loop()
{
  if (WiFi.status() != WL_CONNECTED) {
    blinkLed(20, 50); // Blink fast to indicate failed WiFi connection
    WiFi.begin(WIFI_SSID, WIFI_PASS);

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

  ArduinoOTA.handle();
  long now = millis();

  if (!mqttClient.connected())
  {
    long now = millis();

    if (now - LAST_RECONNECT_ATTEMPT > 5000)
    {
      LAST_RECONNECT_ATTEMPT = now;

      if (mqttReconnect())
      {
        LAST_RECONNECT_ATTEMPT = 0;
      }
    }
  }
  else
  {
    mqttClient.loop();
  }

  if (now - LAST_UPDATE_SENT > UPDATE_INTERVAL)
  {
    readP1Serial();
  }
}