#include <Adafruit_NeoPixel.h>
#include <IRremote.h>

#define PIN            6   // Pin, kde je pripojený NeoPixel
#define NUMPIXELS      20  // Celkový počet NeoPixelov v reťazci

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

unsigned long previousMillisZelene = 0;
const long intervalZelene = 1000;  // Interval pre blikanie zelených (v milisekundách)

unsigned long previousMillisSerial = 0;
const long intervalSerial = 100;  // Interval pre kontrolu sériovej komunikácie (v milisekundách)

int pocetSviec = 0;  // Počet sviečok
int pocetZltychLED = 0;  // Počet žltých LED
#define PIN_RECEIVER 2
IRrecv receiver(PIN_RECEIVER);

void setup() {
  Serial.begin(9600);
  pixels.begin(); // Inicializácia knižnice NeoPixel
  pixels.show();  // Inicializácia farieb
  receiver.enableIRIn();
}

void loop() {
  blikajZelene(); // Blikanie zelenou farbou

  kontrolaSerialu(); // Kontrola sériovej komunikácie a zobrazenie žltých LED
  svietSviece(); // Zobrazenie sviečok podľa počtu
}

void svietSviece() {
  pixels.clear(); // Vymazanie všetkých farieb

  for (int i = 0; i < pocetSviec; i++) {
    int index = i * 5; // Výpočet indexu pre každú sviečku (5 LED na sviečku)
    if (index < NUMPIXELS) {
      pixels.setPixelColor(index, pixels.Color(255, 255, 0)); // Žltá farba pre sviečky
    }
  }

  for (int i = 0; i < pocetZltychLED; i++) {
    int index = i * 5; // Výpočet indexu pre každú žltú LED (5 LED na sviečku)
    if (index < NUMPIXELS) {
      pixels.setPixelColor(index, pixels.Color(255, 255, 0)); // Žltá farba pre žlté LED
    }
  }

  pixels.show(); // Aktualizácia zobrazenia
}

void blikajZelene() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillisZelene >= intervalZelene) {
    previousMillisZelene = currentMillis;

    for (int j = 0; j < 2; j++) {
      for (int i = 0; i < NUMPIXELS; i++) {
        if (i % 5 != 0) {
          pixels.setPixelColor(i, pixels.Color(0, 255, 0)); // Zelená farba
        } else {
          pixels.setPixelColor(i, pixels.Color(255, 255, 0)); // Žltá farba pre sviece
        }
      }

      pixels.show(); // Aktualizácia zobrazenia

      delay(500); // Krátka pauza pre lepšiu viditeľnosť žltých LED

      pixels.clear(); // Vymazanie všetkých farieb
      svietSviece(); // Nastavenie späť na žltú farbu
      delay(500); // Pauza pred ďalším blikaním
    }
  }
}

void kontrolaSerialu() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillisSerial >= intervalSerial) {
    previousMillisSerial = currentMillis;

    if (Serial.available() > 0) {
      int novyPocetSviec = 4; // Načítanie čísla zo série pre počet sviečok
      int novyPocetZltychLED = Serial.parseInt(); // Načítanie čísla zo série pre počet žltých LED

    switch (receiver.decodedIRData.command) {
    
    case 104:
      pixels.clear();
      break;
    case 48:
      novyPocetZltychLED = 1;
      break;
    case 24:
      novyPocetZltychLED = 2;

      break;
    case 122:
      novyPocetZltychLED = 3;

      break;
    case 16:
      novyPocetZltychLED = 4;

      break;
    default:
      pixels.clear();
  }
  Serial.println(novyPocetZltychLED);
      // Ochrana proti neplatným hodnotám
      if (novyPocetSviec >= 0 && novyPocetSviec <= 4) {
        pocetSviec = novyPocetSviec;
      }

      if (novyPocetZltychLED >= 0 && novyPocetZltychLED <= 4) {
        pocetZltychLED = novyPocetZltychLED;
      }
    }
  }
}