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

#define PIN_LED_DATA 7
#define NUM_LEDS 154
#define PIN_BUTTON_MINUTES A0
#define PIN_BUTTON_HOURS A1
#define PIN_TEMP_SENSOR 8
#define PIN_RTC_SDA 20
#define PIN_RTC_SCL 21

RTC_DS1307 rtc;
OneWire oneWire(PIN_TEMP_SENSOR);
DallasTemperature sensors(&oneWire);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN_LED_DATA, NEO_GRB + NEO_KHZ800);

int digitAddresses[4][10][4] = {
  // Digit 1
  {
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 22, 23, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 },
    {9, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 28 },
    {0, 1, 6, 7, 8, 9, 12, 13, 14, 18, 22, 23, 25, 28, 29, 30, 31 },
    {0, 1, 7, 8, 9, 13, 14, 22, 23, 26, 28, 29, 30, 31, 32, 34, 35, 36, 37 },
    {4, 5, 10, 12, 16, 19, 24, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37 },
    {0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 13, 14, 17, 22, 23, 25, 28, 29, 33, 34, 35, 36 },
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 18, 22, 23, 26, 28, 29, 33, 34, 35, 36, 37 },
    {0, 9, 14, 23, 29, 30, 31, 32, 33, 34, 35, 36, 37 },
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 18, 22, 23, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 },
    {0, 1, 2, 3, 4, 8, 9, 11, 13, 14, 18, 22, 23, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 }
  },
  // Digit 2
  {
    {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 51, 52, 60, 61, 66, 67, 68, 69, 70, 71, 72, 73, 74, 65 },
    {47, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 },
    {38, 39, 44, 45, 46, 47, 50, 51, 52, 56, 60, 61, 63, 66, 67, 68, 69, 75 },
    {38, 39, 45, 46, 47, 51, 52, 60, 61, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75 },
    {42, 43, 48, 50, 54, 57, 62, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75 },
    {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 51, 52, 55, 60, 61, 63, 66, 67, 71, 72, 73, 74 },
    {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 56, 60, 61, 64, 66, 67, 71, 72, 73, 74, 75 },
    {38, 47, 52, 61, 67, 68, 69, 70, 71, 72, 73, 74, 75 },
    {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 56, 60, 61, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75 },
    {38, 39, 40, 41, 42, 46, 47, 49, 51, 52, 56, 60, 61, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75 }
  },
  // Digit 3
  {
    {76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 89, 90, 98, 99, 104, 105, 106, 107, 108, 109, 110, 111, 112, 103 },
    {85, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104 },
    {76, 77, 82, 83, 84, 85, 88, 89, 90, 94, 98, 99, 101, 104, 105, 106, 107 },
    {76, 77, 82, 83, 84, 89, 90, 98, 99, 102, 104, 105, 106, 107, 108, 110, 111, 112, 113 },
    {79, 80, 85, 88, 92, 95, 100, 103, 105, 106, 107, 108, 109, 110, 111, 112, 113 },
    {76, 77, 78, 79, 80, 82, 83, 84, 85, 10, 89, 90, 93, 98, 99, 101, 104, 105, 109, 110, 111, 112 },
    {76, 85, 90, 99, 105, 106, 107, 108, 109, 110, 111, 112, 113 },
    {76, 85, 90, 99, 105, 106, 107, 108, 109, 110, 111, 112, 113 },
    {76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 89, 90, 94, 98, 99, 102, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113 },
    {76, 77, 78, 79, 80, 84, 85, 87, 89, 90, 94, 98, 99, 102, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113 }
  },
  // Digit 4
  {
    {114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 142, 143, 144, 145, 146, 147, 148, 149, 150, 141 },
    {123, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 142 },
    {114, 115, 120, 121, 122, 123, 126, 127, 128, 132, 136, 137, 139, 142, 143, 144, 145 },
    {114, 115, 121, 122, 123, 127, 128, 136, 137, 140, 142, 143, 144, 145, 146, 148, 149, 150, 151 },
    {118, 119, 124, 126, 130, 133, 138, 141, 143, 144, 145, 146, 147, 148, 149, 150, 151 },
    {114, 115, 116, 117, 118, 120, 121, 122, 123, 139, 142, 143, 147, 148, 149, 150 },
    {114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 125, 127, 128, 132, 136, 137, 140, 142, 143, 147, 148, 149, 150, 151 },
    {114, 123, 128, 137, 143, 144, 145, 146, 147, 148, 149, 150, 151 },
    {114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 125, 127, 128, 132, 136, 137, 140, 142, 143, 147, 148, 149, 150, 151 },
    {114, 115, 116, 117, 118, 122, 123, 125, 127, 128, 132, 136, 137, 140, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151 }
  }
};

void setup() {
  Serial.begin(9600);
  pinMode(PIN_BUTTON_MINUTES, INPUT);
  pinMode(PIN_BUTTON_HOURS, INPUT);
  
  Wire.begin();
  rtc.begin();
  if (!rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  
  sensors.begin();
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  DateTime now = rtc.now();
  int currentMinute = now.minute();
  int currentHour = now.hour();
  int currentSecond = now.second();
  
  // Display time for 45 seconds
  for (int i = 0; i < 45; i++) {
    displayTime(currentMinute, currentHour, currentSecond);
    delay(1000);
    currentSecond = (currentSecond + 1) % 60;
  }
  
  // Display temperature for 8 seconds
  for (int i = 0; i < 8; i++) {
    displayTemperature();
    delay(1000);
  }
}

void displayTime(int minute, int hour, int second) {
  // Clear display
  strip.clear();

  // Display minutes
  displayDigit(minute % 10, 0);
  displayDigit(minute / 10, 1);

  // Display hours
  displayDigit(hour % 10, 2);
  displayDigit(hour / 10, 3);

  // Flash seconds LEDs
  if (second % 2 == 0) {
    strip.setPixelColor(152, strip.Color(255, 0, 0)); // LED 152 ON
    strip.setPixelColor(153, strip.Color(255, 0, 0)); // LED 153 ON
  } else {
    strip.setPixelColor(152, strip.Color(0, 0, 0)); // LED 152 OFF
    strip.setPixelColor(153, strip.Color(0, 0, 0)); // LED 153 OFF
  }

  strip.show();
}

void displayTemperature() {
  // Clear display
  strip.clear();

  // Turn on temperature display LEDs
  strip.setPixelColor(35, strip.Color(0, 255, 0)); // LED 35 ON
  strip.setPixelColor(36, strip.Color(0, 255, 0)); // LED
GND5VSDASCLSQWRTCDS1307+