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

#define PIN 25 // Pinnen vi bruker til Neopixlene
// Det er en feil i biblioteket her på WOKWI så vi må simulere med 69 pixler
#define NUMPIXELS 60 // Antall neopixler på en hel sirkel


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

#include "funksjoner.h" // Inkluder den nye header-filen
#include "animasjoner.h" // Inkluderer animasjonene

timePlan plan[40];

// Statusbits for animasjon:
bool erFriminutt = false; // Blir True når det blir friminutt
bool erTime = false;      // Blir True når det blir time 
bool erFerdig = false;    // Blir True når skoledagen er over
bool erHelg = false;      // Blir True når det er helg
byte gjeldende = 0;    // Gjeldende aktivitet, Aktiviteten som er akkurat nå
byte forrige = 0;      // Forrige aktivitet, Aktiviteten vi hadde for 1 millisekund siden

byte R_LED = 0;
byte G_LED = 0;
byte B_LED = 0;

int igjen = 0;

void setup() {
  Serial.begin(115200);
  
  strip.begin();
  strip.show(); // Setter alle pixlene til 'AV'

  if (! rtc.begin()) {
    Serial.println("Finner ikke RTC");
    Serial.flush();
    abort();
  }
  if (!rtc.isrunning()) {
    Serial.println("Klokken er feil!");
  }

  fyllPlan(); // Fyller timeplanen inni funksjoner.h

}

void loop() {

  // STILL KLOKKEN! Skriv "tid" for å stille
  if (Serial.available()) {
    String kommando = Serial.readStringUntil('\n');
    if (kommando == "animasjon") {
      ferdigForDagen();
    }
    if(kommando == "tid"){
      stillKlokke();// Denne funksjonen skal stille klokken med serial input
    }
    if(kommando == "time"){
      timeAnimasjon();
    }

  }

  DateTime now = rtc.now();
  
  
  gjeldende = fagNummer(now, plan); // Denne returnerer hvilket fagnummer vi har akkurat nå

  if(gjeldende != forrige){
    Serial.print("NY AKTIVITET!!!");
    
    switch(gjeldende){
      case 0:
        if(now.dayOfTheWeek() == 5){
          erHelg = true;
        }
        else{
          erFerdig = true;
        }
        break;
      case 1:
        erFriminutt = true;
        break;
      default:
        erTime = true;
    }

    forrige = gjeldende;  // Gjør at vi bare kjører dette en gang hver gang vi 
  }
  
  
  igjen = tidIgjen(now.dayOfTheWeek(), now.hour(), now.minute(), now.second());
  
  Serial.print("Akkurat nå har vi: ");
  Serial.print(fag(now, plan));
  Serial.print(" (");
  Serial.print(fagNummer(now, plan));
  Serial.println(")");
  Serial.print("Klokken er: ");
  Serial.print(now.hour());
  Serial.print(":");
  Serial.print(now.minute());
  Serial.print(":");
  Serial.println(now.second());
  Serial.print("Dag i uken: ");
  Serial.println(now.dayOfTheWeek());
  if( igjen > 0){
    Serial.print("Det er ");
    Serial.print(igjen);
    Serial.println(" sek igjen av timen");
  }


//*************** ANIMASJONER ********************

  if (erFriminutt){
    //friminuttAnimasjon();
    erFriminutt = false;
  }

  if (erTime){
    //timeAnimasjon();
    erTime = false;
  }
  
  if (erFerdig){
    //ferdigAnimasjon();
    erFerdig = false;
  }

  if (erHelg){
    //HelgAnimasjon();
    erHelg = false;
  }

//************************************************

  // Oppdater LEDstrip mellom strip.clear() og strip.show()
  strip.clear();  
  //klokke(now.hour(), now.minute(), now.second());

  int gjeldendeMinutt = now.minute();
  int varighet = igjen/60 + 1; // Sett varigheten til timen her
  lysOppTilSlutt(gjeldendeMinutt, varighet);

  strip.show();
  delay(200);
}
GND5VSDASCLSQWRTCDS1307+