#include "Backend.h"

PixelRing ring(CRGB(255, 0, 0), STATIC);

// Left side - mode ctrl (static, random, running cw, running ccw)
Led ledSTA(4);
Led ledRND(3);
Led ledCW(2);
Led ledCCW(1);
Button buttonSTA(12, STATIC);
Button buttonRND(8, RANDOM);
Button buttonCW(7, RUNNING_CW);
Button buttonCCW(5, RUNNING_CCW);

// Right side - color / tempo ctrl (red, green, blue, tempo)
Led ledRed(11);
Led ledGreen(10);
Led ledBlue(9);
Led ledWhite(6);
ColorController ctrlRed(A0, &ledRed);
ColorController ctrlGreen(A1, &ledGreen);
ColorController ctrlBlue(A2, &ledBlue);
Controller ctrlTempo(A3);

AnimationSelector aSel(STATIC, {{&buttonSTA, &buttonRND, &buttonCW, &buttonCCW}, {&ledSTA, &ledRND, &ledCW, &ledCCW}});

void setup() {
  randomSeed(analogRead(A4));

  ring.init();

  ledRed.init();
  ledGreen.init();
  ledBlue.init();
  ledWhite.init();

  aSel.init();
}

void loop() {
  // Global time
  sysTime = millis();
  ring.animation(ledWhite);

  // Polling potentiometers and calling color setter of pixel ring
  ctrlRed.update(&PixelRing::setRed, ring);
  ctrlGreen.update(&PixelRing::setGreen, ring);
  ctrlBlue.update(&PixelRing::setBlue, ring);
  ctrlTempo.update(&PixelRing::setAnimationInterval, ring);

  // Polling buttons, calling animation setter of pixel ring and turning on the led
  aSel.update(&PixelRing::setAnimation, ring);
}