#include <WiFi.h>
#include <time.h>

#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 68 // 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

// Wifi
const char* ssid = "Wokwi-GUEST";
const char* wifipw = "";

uint32_t fagFarge[10] = {
  strip.Color(0, 0, 0), 
  strip.Color(0,255,0),
  strip.Color(102,205,170),
  strip.Color(0,128,128),
  strip.Color(205,92,92),
  strip.Color(255,0,0),
  strip.Color(60,179,113),
  strip.Color(0,100,0),
  strip.Color(188,143,143)
};

int igjen = 0;

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

  // Starter opp trådløst nett
  WiFi.begin(ssid, wifipw, 6);
  Serial.println("Kobler til WiFi");
  
  delay(6000); //Gi den litt tid til å koble seg til
  if(WiFi.status() == 3){
    alarm(strip.Color(0, 130, 0), 25); //GRØNN ALARM
    Serial.println("TILKOBLET");
  }
  else {
    alarm(strip.Color(130, 0, 0), 25); //RØD ALARM
    Serial.println("IKKE TILKOBLET");
  }
  Serial.print("Wifi RSSI=");
  Serial.println(WiFi.RSSI());

  //Starter opp RTC
  if (! rtc.begin()) {
    Serial.println("Kan ikke finne klokken, kanskje tom for batteri??");
    Serial.flush();
    abort();
  }
  if (!rtc.isrunning()) {
    Serial.println("Klokken er feil!");
  }
  fyllPlan(); // Fyller timeplanen inni funksjoner.h
  
  // Oppdatere RTC med ny tid fra internett
  if(rtc.isrunning() && WiFi.status() == 3){
    initTime("CET-1CEST,M3.5.0,M10.5.0/3");
    struct tm timeinfo;
    if(!getLocalTime(&timeinfo)){
      Serial.println("Fikk ikke ny tid fra NTC :-( ");
      alarm(strip.Color(130, 130, 0), 25); //GUL ALARM
      return;
    }
    else{
      //    **********   Overføre NTC tid til RTC:    ***************
      DateTime nyTid = DateTime(timeinfo.tm_year, timeinfo.tm_mon, timeinfo.tm_wday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
      rtc.adjust(nyTid);
      alarm(strip.Color(0, 0, 130), 25); // BLÅ ALARM
      Serial.println("Kalibrert med ny tid fra NTC :-) ");
      printLocalTime();
    }
  }
}

void loop() {

  // STILL KLOKKEN! Skriv "tid" for å stille
  if (Serial.available()) {
    String kommando = Serial.readStringUntil('\n');
    if (kommando == "tid") {
      stillKlokke();
    }
  }

  DateTime now = rtc.now();
  gjeldende = fagNummer(now, plan);

  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;
        break;
  }

    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){
    alarm(strip.Color(130, 0, 0), 25);
    blink(); 
    alarm(strip.Color(130, 0, 0), 25);
    skruAv();
    erTime = false;
  }
  
  if (erFerdig){
    ring(strip.Color(74, 129, 130), 30);
    runde(strip.Color(74, 129, 130), 50); 
    skruAv();
    erFerdig = false;
  }

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

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

   
  // Oppdater LEDstrip mellom strip.clear() og strip.show()
  strip.clear();  
  
  nedTelling(igjen, fagFarge[gjeldende]); 

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