#include <Adafruit_TSL2591.h>
#include "esp8266_mqtt_setup.h"

const char* topicLux = "aquaponics/air/lux";
const char* topicVisible = "aquaponics/air/visible";
const char* topicInfrared = "aquaponics/air/infrared";
const char* topicFullSpectrum = "aquaponics/air/full_spectrum";

const char* clientName = "LightSensorClient";

Adafruit_TSL2591 lightSensor = Adafruit_TSL2591(2591);

const int MEASUREMENT_PERIOD = 5000;
unsigned long lastMeasurement = 0;

void setup() {
  Serial.begin(115200);

  lightSensor.begin();
  lightSensor.setGain(TSL2591_GAIN_LOW);
  lightSensor.setTiming(TSL2591_INTEGRATIONTIME_100MS);

  setup_wifi();
  
  setup_mqtt();
}

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

  unsigned long currentMillis = millis();
  if (currentMillis - lastMeasurement >= MEASUREMENT_PERIOD) {
    lastMeasurement = currentMillis;
    TakeLightMeasurement();
  }

  delay(500);
}

void TakeLightMeasurement() {
  int lum = lightSensor.getFullLuminosity();
  int infrared = lum >> 16;
  int full = lum & 0xFFFF;
  int lux = lightSensor.calculateLux(full, infrared);
  int visible = full - infrared;
  
  Serial.print("Lux: ");
  Serial.println(lux);
  Serial.print("Visible: ");
  Serial.println(visible);
  Serial.print("Infrared: ");
  Serial.println(infrared);
  Serial.print("Full Spectrum: ");
  Serial.println(full);

  mqttClient.publish(topicLux, String(lux).c_str());
  mqttClient.publish(topicVisible, String(visible).c_str());
  mqttClient.publish(topicInfrared, String(infrared).c_str());
  mqttClient.publish(topicFullSpectrum, String(full).c_str());
}