#include <WiFi.h>
#include <WebServer.h>
#include <ArduinoJson.h>
#include <BH1750.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// Настройки Wi-Fi
const char* ssid = "Kvant ";
const char* password = "1941194504";

// Создание объекта веб-сервера на порту 80
WebServer server(80);

// Создание объектов датчиков
BH1750 lightMeter;
Adafruit_BME280 bme280;

// Отдельные переменные для путей
const char* adminTokenPath = "/admin/token/reiojfjoiwr38923e0u58turwkjowHFI733jwf023/";
const char* rele1Path = "/admin/token/reiojfjoiwr38923e0u58turwkjowHFI733jwf023/rele1";
const char* rele2Path = "/admin/token/reiojfjoiwr38923e0u58turwkjowHFI733jwf023/rele2";
const char* rele3Path = "/admin/token/reiojfjoiwr38923e0u58turwkjowHFI733jwf023/rele3";
const char* rele4Path = "/admin/token/reiojfjoiwr38923e0u58turwkjowHFI733jwf023/rele4";

// Настройки датчика влажности почвы
#define SOIL_MOISTURE 34
const float air_value = 1587.0;
const float water_value = 800.0;
const float moisture_0 = 0.0;
const float moisture_100 = 100.0;

// Пины для реле
#define RELAY1 13
#define RELAY2 5
#define RELAY3 15
#define RELAY4 14

void setup() {
    // Инициализация последовательного порта
    Serial.begin(115200);

    // Инициализация Wi-Fi
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("Connected to WiFi");

    // Вывод локального IP-адреса
    IPAddress localIP = WiFi.localIP();
    Serial.print("Local IP: ");
    Serial.println(localIP);

    // Инициализация датчиков
    Wire.begin();
    lightMeter.begin();
    bool bme_status = bme280.begin();
    if (!bme_status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
    }

    // Инициализация пинов реле
    pinMode(RELAY1, OUTPUT);
    pinMode(RELAY2, OUTPUT);
    pinMode(RELAY3, OUTPUT);
    pinMode(RELAY4, OUTPUT);

    // Обработчик запросов для датчиков
    server.on(adminTokenPath, HTTP_GET, []() {
    // Считывание данных с датчиков
    float lux = lightMeter.readLightLevel();
    float t = bme280.readTemperature();
    float adc0 = analogRead(SOIL_MOISTURE);
    float h = map(adc0, air_value, water_value, moisture_0, moisture_100);

    // Округление значений до целых чисел
    int roundedLux = abs(round(lux));
    int roundedTemp = abs(round(t));
    int roundedHumidity = abs(round(h));

    // Создание JSON-ответа
    DynamicJsonDocument jsonDoc(200);
    jsonDoc["light"] = roundedLux;
    jsonDoc["temperature"] = roundedTemp;
    jsonDoc["humidity"] = roundedHumidity;

    // Отправка JSON-ответа
    String jsonResponse;
    serializeJson(jsonDoc, jsonResponse);
    server.send(200, "application/json", jsonResponse);
});

    // Обработчик запросов для управления реле
    server.on(rele1Path, HTTP_GET, []() {
        handleRelay(RELAY1);
    });
    server.on(rele2Path, HTTP_GET, []() {
        handleRelay(RELAY2);
    });
    server.on(rele3Path, HTTP_GET, []() {
        handleRelay(RELAY3);
    });
    server.on(rele4Path, HTTP_GET, []() {
        handleRelay(RELAY4);
    });

    // Запуск сервера
    server.begin();
}

void loop() {
    // Обработка запросов к серверу
    server.handleClient();
}

void handleRelay(int relayPin) {
    if (server.hasArg("work")) {
        String workParam = server.arg("work");
        if (workParam == "1") {
            digitalWrite(relayPin, HIGH);
            server.send(200, "text/plain", "Relay turned ON");
        } else if (workParam == "2") {
            digitalWrite(relayPin, LOW);
            server.send(200, "text/plain", "Relay turned OFF");
        } else {
            server.send(400, "text/plain", "Invalid work parameter");
        }
    } else {
        server.send(400, "text/plain", "Missing work parameter");
    }
}