#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <RTClib.h>

#define PIN 6
#define NUMPIXELS 100

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
RTC_DS1307 rtc;

// Definer fargene for de forskjellige fagene
const uint32_t Matte = pixels.Color(255, 0, 0);
const uint32_t Friminutt = pixels.Color(0, 255, 0);
const uint32_t Norsk = pixels.Color(0, 0, 255);
// Legg til flere farger her

// Enum for ukedagene
enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY };

// Struktur for å representere en tidsluke
struct TimeSlot {
  Weekday day;      // Ukedag
  int startHour;    // Starttime
  int startMinute;  // Startminutt
  int endHour;      // Sluttime
  int endMinute;    // Sluttminutt
  uint32_t color;   // Farge for Neopixelringen
};

// Array som inneholder timeplanen for hele uken
TimeSlot schedule[] = {
  {MONDAY, 8, 0, 8, 45, Matte},  // Mandag: Fag 1: 08:00 - 08:45 (Rød)
  {MONDAY, 8, 45, 9, 0, Friminutt}, // Mandag: Friminutt: 08:45 - 09:00 (Grønn)
  {MONDAY, 9, 0, 9, 45, Norsk}, // Mandag: Fag 2: 09:00 - 09:45 (Blå)
  // Legg til flere tidsluker for mandag
  {TUESDAY, 8, 0, 8, 45, Norsk},  // Tirsdag: Fag 1: 08:00 - 08:45 (Blå)
  {TUESDAY, 8, 45, 9, 0, Friminutt}, // Tirsdag: Friminutt: 08:45 - 09:00 (Grønn)
  {TUESDAY, 9, 0, 9, 45, Matte}, // Tirsdag: Fag 2: 09:00 - 09:45 (Rød)
  // Legg til flere tidsluker for tirsdag
  // Legg til tidsluker for resten av ukedagene
};

void setup() {
  Serial.begin(9600); // Start Serial kommunikasjon
  pixels.begin();
  pixels.show(); // Slå av alle lysene
  if (!rtc.begin()) {
    Serial.println("RTC ikke funnet!");
    while (1);
  }
  if (!rtc.isrunning()) {
    Serial.println("RTC kjører ikke, setter tid...");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  rtc.adjust(DateTime(2024, 10, 7, 7, 59, 50));
}

void loop() {
  DateTime now = rtc.now(); // Hent nåværende tid fra RTC
  bool isActive = false;    // Variabel for å sjekke om vi er i en aktiv tidsluke

  // Skriv nåværende tid til Serial Monitor
  Serial.print("Nåværende tid: ");
  Serial.print(now.hour());
  Serial.print(":");
  Serial.print(now.minute());
  Serial.print(":");
  Serial.println(now.second());

  // Sjekk om nåværende tid er innenfor noen av tidslukene
  for (TimeSlot slot : schedule) {
    if (now.dayOfTheWeek() == slot.day &&
        now.hour() >= slot.startHour && now.minute() >= slot.startMinute &&
        now.hour() <= slot.endHour && now.minute() <= slot.endMinute) {
      
      // Beregn totalt antall sekunder i tidsluken
      int totalSeconds = ((slot.endHour - slot.startHour) * 60 + (slot.endMinute - slot.startMinute)) * 60;
      // Beregn antall sekunder som har gått siden starten av tidsluken
      int secondsPassed = ((now.hour() - slot.startHour) * 60 + (now.minute() - slot.startMinute)) * 60 + now.second();
      // Beregn antall sekunder som er igjen
      int secondsRemaining = totalSeconds - secondsPassed;
      // Beregn antall lys som skal være tent
      int pixelsToLight = (secondsRemaining * NUMPIXELS) / totalSeconds;

      // Sett fargen på de nødvendige lysene
      pixels.clear();
      for (int i = 0; i < pixelsToLight; i++) {
        pixels.setPixelColor(i, slot.color);
      }
      pixels.show(); // Oppdater Neopixelringen

      isActive = true; // Sett isActive til true hvis vi er i en aktiv tidsluke
      Serial.print("Status: Aktiv tidsluke, sekunder igjen: ");
      Serial.println(secondsRemaining);
      break; // Avslutt løkken hvis vi har funnet en matchende tidsluke
    }
  }

  // Hvis ingen tidsluke er aktiv, slå av lysene og skriv status til Serial Monitor
  if (!isActive) {
    pixels.clear();
    pixels.show();
    Serial.println("Status: Ingen aktiv tidsluke");
  }

  delay(1000); // Vent ett sekund før neste oppdatering
}
GND5VSDASCLSQWRTCDS1307+