#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#include <Wire.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <SparkFun_ENS160.h>

// Wi-Fi Credentials
const char* ssid = "_____";
const char* password = "_____";

ESP8266WebServer server(80);

#define ADDR_IN  0x52
#define ADDR_OUT 0x53

#define SDA_PIN D2
#define SCL_PIN D1

SparkFun_ENS160 sensorIn;
SparkFun_ENS160 sensorOut;

uint16_t co2In = 0, tvocIn = 0;
uint16_t co2Out = 0, tvocOut = 0;

bool initSensor(SparkFun_ENS160 &sensor, const char* label, uint8_t address) {
  if (!sensor.begin(Wire, address)) {
    Serial.print(label); Serial.println(" init FAIL");
    return false;
  }
  Serial.print(label); Serial.println(" init OK");
  sensor.setOperatingMode(0x02);
  return true;
}

void readSensor(SparkFun_ENS160 &sensor, const char* label, uint16_t &co2, uint16_t &tvoc) {
  if (sensor.checkDataStatus()) {
    co2 = sensor.getECO2();
    tvoc = sensor.getTVOC();
    Serial.printf("%s: CO2 = %d ppm, TVOC = %d ppb\n", label, co2, tvoc);
  } else {
    Serial.printf("%s: No data\n", label);
    co2 = 0;
    tvoc = 0;
  }
}

void handleRoot() {
  String html = "<!DOCTYPE html><html><head><meta charset='UTF-8'>";
  html += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
  html += "<meta http-equiv='refresh' content='5'>";
  html += "<style>";
  html += "body { font-family: Arial, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #f7f7f7; }";
  html += ".card { background: white; padding: 30px 40px; border-radius: 16px; box-shadow: 0 10px 30px rgba(0,0,0,0.1); text-align: center; }";
  html += "h1 { margin-bottom: 20px; font-size: 24px; }";
  html += "p { font-size: 18px; margin: 8px 0; }";
  html += "hr { margin: 20px 0; border: none; height: 1px; background-color: #ddd; }";
  html += "</style></head><body>";
  html += "<div class='card'>";
  html += "<h1>🌿 Air Quality Readings (ENS160)</h1>";
  html += "<p><strong>CO₂ IN:</strong> " + String(co2In) + " ppm</p>";
  html += "<p><strong>TVOC IN:</strong> " + String(tvocIn) + " ppb</p>";
  html += "<hr>";
  html += "<p><strong>CO₂ OUT:</strong> " + String(co2Out) + " ppm</p>";
  html += "<p><strong>TVOC OUT:</strong> " + String(tvocOut) + " ppb</p>";
  html += "<p style='margin-top:20px; font-size:14px; color:gray;'>Page refreshes every 5 seconds</p>";
  html += "</div></body></html>";

  server.send(200, "text/html", html);
}

void setup() {
  Serial.begin(115200);
  Wire.begin(SDA_PIN, SCL_PIN);
  delay(1000);

  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.println(WiFi.localIP());

  initSensor(sensorIn, "Sensor IN", ADDR_IN);
  delay(500);
  initSensor(sensorOut, "Sensor OUT", ADDR_OUT);
  delay(500);

  server.on("/", handleRoot);
  server.begin();
  Serial.println("Web server started");

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  Serial.println(F("SSD1306 allocation failed"));
  for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("OLED Ready...");
display.display();
delay(1000);
}

void loop() {
  readSensor(sensorIn, "Sensor IN", co2In, tvocIn);
  delay(500);
  readSensor(sensorOut, "Sensor OUT", co2Out, tvocOut);

  server.handleClient();
  delay(3000);

display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.print("IN: CO2 ");
display.print(co2In);
display.println(" ppm");
display.print("IN: TVOC ");
display.print(tvocIn);
display.println(" ppb");

display.println();

display.print("OUT: CO2 ");
display.print(co2Out);
display.println(" ppm");
display.print("OUT: TVOC ");
display.print(tvocOut);
display.println(" ppb");

display.display();
}