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

#define PIN (6)
#define NUM_PIX 4 * 35 + 8 // four 5x7 matrices and four colons
RTC_DS3231 rtc;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(148, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  // Setup the LED strip and RTC module.
  strip.begin();
  strip.show();
  rtc.begin();
}

void loop() {
  // randoms();
  // markpix();
  // chase(strip.Color(random(256), random(256), random(256))); // 0 to end
  rainbow(10);
  // colorWipe(strip.Color(random(256), random(256), random(256)), 0);
}

void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
  }
}

void chase(uint32_t c) {
  for(uint16_t i=0; i<strip.numPixels()+3; i++) {
      strip.setPixelColor(i  , c); // Draw new pixel
      strip.setPixelColor(i-3, 0); // Erase old pixels
      strip.show();
      delay(25);
  }
}

void rainbow(int wait) {
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
    strip.rainbow(firstPixelHue);
    strip.show();
    delay(wait);
  }
}

void markpix () { // a test function to mark/light key pixels
  // first pixel RED
  strip.setPixelColor(111, 255, 0, 0);
  strip.setPixelColor(74, 255, 0, 0);
  strip.setPixelColor(37, 255, 0, 0);
  strip.setPixelColor(0, 255, 0, 0);

  // last pixel GRN
  strip.setPixelColor(145, 0, 255, 0);
  strip.setPixelColor(108, 0, 255, 0);
  strip.setPixelColor(71, 0, 255, 0);
  strip.setPixelColor(34, 0, 255, 0);

  // colon CYN:MAG
  strip.setPixelColor(147, 255, 0, 255);
  strip.setPixelColor(146, 0, 255, 255);

  strip.setPixelColor(110, 255, 0, 255);
  strip.setPixelColor(109, 0, 255, 255);

  strip.setPixelColor(73, 255, 0, 255);
  strip.setPixelColor(72, 0, 255, 255);

  strip.setPixelColor(36, 255, 0, 255);
  strip.setPixelColor(35, 0, 255, 255);
  strip.show();
}

void randoms() {
  for (int i = 0; i < NUM_PIX; i++)
    strip.setPixelColor(i, random(256), random(256), random(256));
  strip.show();
}

/* (Methods to un-set certain LEDs to form 7-segment digits.) */

void unsetTimeDigits() {
  DateTime now = rtc.now();
  flip_digits(now.hour() / 10, now.hour() % 10, now.minute() / 10, now.minute() % 10);
}

void flip_digits(int d1, int d2, int d3, int d4) {
  // First digit.
  flip_digit(111, d1);
  // Second digit.
  flip_digit(74, d2);
  // Third digit.
  flip_digit(37, d3);
  // Fourth digit.
  flip_digit(0, d4);
}

void flip_digit(int first_led, int val) {
  if (val == 0) {
    //strip.setPixelColor(first_led, 0);
    strip.setPixelColor(first_led + 15, 0);
    strip.setPixelColor(first_led + 16, 0);
    strip.setPixelColor(first_led + 17, 0);
    strip.setPixelColor(first_led + 18, 0);
    strip.setPixelColor(first_led + 19, 0);
  }
  else if (val == 1) {
    // strip.setPixelColor(first_led, 0);
    strip.setPixelColor(first_led + 5, 0);
    strip.setPixelColor(first_led + 6, 0);
    strip.setPixelColor(first_led + 7, 0);
    strip.setPixelColor(first_led + 8, 0);
    strip.setPixelColor(first_led + 9, 0);

    strip.setPixelColor(first_led + 10, 0);
    strip.setPixelColor(first_led + 11, 0);
    strip.setPixelColor(first_led + 12, 0);
    strip.setPixelColor(first_led + 13, 0);
    strip.setPixelColor(first_led + 14, 0);

    strip.setPixelColor(first_led + 15, 0);
    strip.setPixelColor(first_led + 16, 0);
    strip.setPixelColor(first_led + 17, 0);
    strip.setPixelColor(first_led + 18, 0);
    strip.setPixelColor(first_led + 19, 0);

    strip.setPixelColor(first_led + 25, 0);
    strip.setPixelColor(first_led + 26, 0);
    strip.setPixelColor(first_led + 27, 0);
    strip.setPixelColor(first_led + 28, 0);
    strip.setPixelColor(first_led + 29, 0);

    strip.setPixelColor(first_led + 30, 0);
    strip.setPixelColor(first_led + 31, 0);
    strip.setPixelColor(first_led + 32, 0);
    strip.setPixelColor(first_led + 33, 0);
    strip.setPixelColor(first_led + 34, 0);

  }
  else if (val == 2) {

    strip.setPixelColor(first_led + 10, 0);
    strip.setPixelColor(first_led + 11, 0);
    strip.setPixelColor(first_led + 12, 0);
    strip.setPixelColor(first_led + 13, 0);
    strip.setPixelColor(first_led + 14, 0);

    strip.setPixelColor(first_led + 20, 0);
    strip.setPixelColor(first_led + 21, 0);
    strip.setPixelColor(first_led + 22, 0);
    strip.setPixelColor(first_led + 23, 0);
    strip.setPixelColor(first_led + 24, 0);

  }
  else if (val == 3) {
    strip.setPixelColor(first_led + 10, 0);
    strip.setPixelColor(first_led + 11, 0);
    strip.setPixelColor(first_led + 12, 0);
    strip.setPixelColor(first_led + 13, 0);
    strip.setPixelColor(first_led + 14, 0);

    strip.setPixelColor(first_led + 30, 0);
    strip.setPixelColor(first_led + 31, 0);
    strip.setPixelColor(first_led + 32, 0);
    strip.setPixelColor(first_led + 33, 0);
    strip.setPixelColor(first_led + 34, 0);

  }
  else if (val == 4) {
    strip.setPixelColor(first_led + 5, 0);
    strip.setPixelColor(first_led + 6, 0);
    strip.setPixelColor(first_led + 7, 0);
    strip.setPixelColor(first_led + 8, 0);
    strip.setPixelColor(first_led + 9, 0);

    strip.setPixelColor(first_led + 25, 0);
    strip.setPixelColor(first_led + 26, 0);
    strip.setPixelColor(first_led + 27, 0);
    strip.setPixelColor(first_led + 28, 0);
    strip.setPixelColor(first_led + 29, 0);

    strip.setPixelColor(first_led + 30, 0);
    strip.setPixelColor(first_led + 31, 0);
    strip.setPixelColor(first_led + 32, 0);
    strip.setPixelColor(first_led + 33, 0);
    strip.setPixelColor(first_led + 34, 0);

  }
  else if (val == 5) {
    strip.setPixelColor(first_led, 0);
    strip.setPixelColor(first_led + 1, 0);
    strip.setPixelColor(first_led + 2, 0);
    strip.setPixelColor(first_led + 3, 0);
    strip.setPixelColor(first_led + 4, 0);

    strip.setPixelColor(first_led + 30, 0);
    strip.setPixelColor(first_led + 31, 0);
    strip.setPixelColor(first_led + 32, 0);
    strip.setPixelColor(first_led + 33, 0);
    strip.setPixelColor(first_led + 34, 0);

  }
  else if (val == 6) {
    strip.setPixelColor(first_led, 0);
    strip.setPixelColor(first_led + 1, 0);
    strip.setPixelColor(first_led + 2, 0);
    strip.setPixelColor(first_led + 3, 0);
    strip.setPixelColor(first_led + 4, 0);
  }
  else if (val == 7) {

    strip.setPixelColor(first_led + 10, 0);
    strip.setPixelColor(first_led + 11, 0);
    strip.setPixelColor(first_led + 12, 0);
    strip.setPixelColor(first_led + 13, 0);
    strip.setPixelColor(first_led + 14, 0);

    strip.setPixelColor(first_led + 15, 0);
    strip.setPixelColor(first_led + 16, 0);
    strip.setPixelColor(first_led + 17, 0);
    strip.setPixelColor(first_led + 18, 0);
    strip.setPixelColor(first_led + 19, 0);

    strip.setPixelColor(first_led + 25, 0);
    strip.setPixelColor(first_led + 26, 0);
    strip.setPixelColor(first_led + 27, 0);
    strip.setPixelColor(first_led + 28, 0);
    strip.setPixelColor(first_led + 29, 0);

    strip.setPixelColor(first_led + 30, 0);
    strip.setPixelColor(first_led + 31, 0);
    strip.setPixelColor(first_led + 32, 0);
    strip.setPixelColor(first_led + 33, 0);
    strip.setPixelColor(first_led + 34, 0);

  }
  else if (val == 8) {

  }
  else if (val == 9) {
    strip.setPixelColor(first_led + 30, 0);
    strip.setPixelColor(first_led + 31, 0);
    strip.setPixelColor(first_led + 32, 0);
    strip.setPixelColor(first_led + 33, 0);
    strip.setPixelColor(first_led + 34, 0);
  }
}