#include <Arduino.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <FirebaseESP32.h>
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"

// Wi-Fi credentials
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";

//  Firebase credentials (from first code)
#define FIREBASE_HOST "https://homeautomation-bb464-default-rtdb.asia-southeast1.firebasedatabase.app/"
#define FIREBASE_API_KEY "AIzaSyD_nEsGB4hDK4H1sQto-cCzPMcEVatBR4M"

// Firebase objects
FirebaseData firebaseData;
FirebaseAuth firebaseAuth;
FirebaseConfig firebaseConfig;
bool signupOK = false;

// GPIO pins for 5 LEDs
const int ledPins[5] = {15, 2, 4, 5, 18};

// NTP Client
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800);  // UTC+5:30 IST

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

  // Setup LED pins
  for (int i = 0; i < 5; i++) {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW);
  }

  // Connect to Wi-Fi
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(300);
  }
  Serial.println("\nConnected to Wi-Fi");

  // Start NTP
  timeClient.begin();

  // Firebase setup
  firebaseConfig.api_key = FIREBASE_API_KEY;
  firebaseConfig.database_url = FIREBASE_HOST;
  firebaseConfig.token_status_callback = tokenStatusCallback;

  // Anonymous sign-in
  if (Firebase.signUp(&firebaseConfig, &firebaseAuth, "", "")) {
    Serial.println("Firebase sign-up OK");
    signupOK = true;
  } else {
    Serial.printf("Sign-up error: %s\n", firebaseConfig.signer.signupError.message.c_str());
  }

  Firebase.begin(&firebaseConfig, &firebaseAuth);
  Firebase.reconnectWiFi(true);

  // Create default LED states in Firebase
  if (signupOK && Firebase.ready()) {
    for (int i = 0; i < 5; i++) {
      String path = "/led" + String(i + 1);
      Firebase.setBool(firebaseData, path, false);
    }
    Serial.println("Initial LED states set.");
  }
}

void loop() {
  timeClient.update();
  String currentTime = timeClient.getFormattedTime(); // HH:MM:SS

  // Format date as dd-MM-yyyy
  time_t rawTime = timeClient.getEpochTime();
  struct tm *tmTime = localtime(&rawTime);
  char dateBuffer[11];
  sprintf(dateBuffer, "%02d-%02d-%04d", tmTime->tm_mday, tmTime->tm_mon + 1, tmTime->tm_year + 1900);
  String currentDate = String(dateBuffer);

  if (Firebase.ready() && signupOK) {
    for (int i = 0; i < 5; i++) {
      String basePath = "/device" + String(i + 1);
      String ledPath = "/led" + String(i + 1);

      // Get schedule values
      if (Firebase.getString(firebaseData, basePath + "/date")) {
        String date = firebaseData.stringData();

        Firebase.getString(firebaseData, basePath + "/on_time");
        String onTime = firebaseData.stringData();

        Firebase.getString(firebaseData, basePath + "/off_time");
        String offTime = firebaseData.stringData();

        // Compare with current date/time
        if (date == currentDate && currentTime >= onTime && currentTime < offTime) {
          digitalWrite(ledPins[i], HIGH);
          Firebase.setBool(firebaseData, ledPath, true);
          Serial.printf("LED%d ON [%s - %s] | NOW: %s\n", i + 1, onTime.c_str(), offTime.c_str(), currentTime.c_str());
        } else {
          digitalWrite(ledPins[i], LOW);
          Firebase.setBool(firebaseData, ledPath, false);
          Serial.printf("LED%d OFF | NOW: %s\n", i + 1, currentTime.c_str());
        }
      }
    }
  }

  delay(1000);
}