#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "TempHumidNN.h"   // TinyML model converted to C

// Pins
static const int DHT_PIN     = 15;
static const int SDA_PIN     = 13;
static const int SCL_PIN     = 14;
static const int LED_OK      = 2;   // LED turns on when “Normal”
static const int LED_WARN    = 4;   // LED turns on when “Extreme”

// Constants
static const unsigned long READ_INTERVAL = 2500;  // ms

DHTesp        sensor;
LiquidCrystal_I2C lcd(0x27, 16, 2);

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

  // Sensor init
  sensor.setup(DHT_PIN, DHTesp::DHT22);

  // LEDs
  pinMode(LED_OK, OUTPUT);
  pinMode(LED_WARN, OUTPUT);
  digitalWrite(LED_OK, LOW);
  digitalWrite(LED_WARN, LOW);

  // I²C + LCD init
  Wire.begin(SDA_PIN, SCL_PIN);
  lcd.init();
  lcd.backlight();

  // Load model
  initModel();
}

void loop() {
  static unsigned long lastRead = 0;
  unsigned long now = millis();
  if (now - lastRead < READ_INTERVAL) return;
  lastRead = now;

  // Read sensor
  TempAndHumidity env = sensor.getTempAndHumidity();
  float inputData[2] = { env.temperature, env.humidity };

  // Run inference
  int classId = tempHumidNN.predict(inputData);

  // Display & LEDs
  showStatus(env.temperature, env.humidity, classId);

  // Debug output
  Serial.printf("Temp=%.1f°C  Hum=%.0f%%  -> %s\n",
                env.temperature,
                env.humidity,
                classId == 0 ? "Normal" : "Extreme");
}

void initModel() {
  while (!tempHumidNN.begin()) {
    Serial.println("Model init error: " + String(tempHumidNN.getErrorMessage()));
    delay(500);
  }
  Serial.println("Model ready!");
}

void showStatus(float temp, float hum, int cls) {
  char line1[17];
  snprintf(line1, sizeof(line1), "T:%.1fC  H:%.0f%%", temp, hum);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(line1);

  lcd.setCursor(0, 1);
  if (cls == 0) {
    lcd.print("Status: OK    ");
    digitalWrite(LED_OK, HIGH);
    digitalWrite(LED_WARN, LOW);
  } else {
    lcd.print("Status: WARN  ");
    digitalWrite(LED_OK, LOW);
    digitalWrite(LED_WARN, HIGH);
  }
}