#include "shield.h"

void setup () {
  MFS.initShield();
  // initShield();

  Serial.begin(9600);

}

enum class Mode {
  CLOCK,
  SET_HOUR,
  SET_MINUTE,
  ALARM,
  ALARM_HOUR,
  ALARM_MINUTE,
};

int hours = 0;
int minutes = 0;
int seconds = 0;

int alarmHour = 0;
int alarmMinute = 0;
bool alarmEnabled = false;

unsigned long counter_next;
unsigned long counter_to = 1000;
unsigned long fps_next;
unsigned long fps_to = 20;

Mode clockMode = Mode::CLOCK;

void loop() {
  unsigned long tm = millis();
  if (counter_next < tm) {
    counter_next = tm + counter_to;

    if (clockMode != Mode::SET_HOUR && clockMode != Mode::SET_MINUTE) {
      if (seconds >= 60) {
        seconds = 0;
        minutes++;
        if (alarmEnabled && hours == alarmHour && minutes == alarmMinute) {
          clockMode = Mode::ALARM;
        }
      }
      else seconds++;
      if (minutes >= 60) {
        minutes = 0;
        hours++;
      }
      if (hours >= 24) {
        hours = 0;
      }
    }
    if (clockMode == Mode::ALARM) {
      MFS.blinkLeds(200, true);
      // beep(10, false);
      // MFS.beep(10, 200, 3, 4, 500);
    }
  }

  if (fps_next < tm) {
    fps_next = tm + fps_to;
    // MFS.writeNumber(0, (minutes / 10) % 10);
    // MFS.writeNumber(1, minutes % 10);
    // MFS.writeNumber(2, (seconds / 10) % 10);
    // MFS.writeNumber(3, seconds % 10);

    if (clockMode == Mode::ALARM_HOUR || clockMode == Mode::ALARM_MINUTE) {
      MFS.writeNumber(0, (alarmHour / 10) % 10);
      MFS.writeNumber(1, alarmHour % 10);
      MFS.writeNumber(2, (alarmMinute / 10) % 10);
      MFS.writeNumber(3, alarmMinute % 10);
    }
    else {
      MFS.writeNumber(0, (hours / 10) % 10);
      MFS.writeNumber(1, hours % 10);
      MFS.writeNumber(2, (minutes / 10) % 10);
      MFS.writeNumber(3, minutes % 10);
    }

    MFS.writeNumber(4, 0);

    // MFS.writeNumber(0, 191);
    // MFS.writeNumber(1, 127);
    // MFS.writeNumber(2, 247);
    // MFS.writeNumber(3, 255);

    byte btn = MFS.getButton();
    if (btn) {
      Serial.println("Button geted");
      if (clockMode == Mode::ALARM) {
        clockMode = Mode::CLOCK;
      }
      else {
        byte buttonNumber = btn & B00111111;
        byte buttonAction = btn & B11000000;

        switch (buttonNumber) {
          case 1:
            if (buttonAction == BUTTON_SHORT_RELEASE_IND) { }
            else if (buttonAction == BUTTON_LONG_PRESSED_IND) {
              Serial.println("BUTTON_1");
              if (clockMode == Mode::CLOCK) {
                clockMode = Mode::SET_HOUR;
                digitalWrite(LED_1_PIN, LOW);
              }
              else if (clockMode == Mode::SET_HOUR) {
                clockMode = Mode::SET_MINUTE;
                MFS.blinkLeds(LED_1_PIN, 50, true);
                digitalWrite(LED_1_PIN, LOW);
              }
              else if (clockMode == Mode::SET_MINUTE) {
                clockMode = Mode::CLOCK;
                digitalWrite(LED_1_PIN, HIGH);
              };
            }
            else if (buttonAction == BUTTON_LONG_RELEASE_IND) { }
            else if (buttonAction == BUTTON_PRESSED_IND) { }
            break;
          case 2:
            if (buttonAction == BUTTON_SHORT_RELEASE_IND) {
              switch (clockMode) {
                case Mode::SET_HOUR:
                  hours++;
                  if (hours >= 24) { hours = 0; }
                  break;
                case Mode::SET_MINUTE:
                  minutes++;
                  if (minutes >= 60) { minutes = 0; }
                  break;
                case Mode::ALARM_HOUR:
                  alarmHour++;
                  if (alarmHour >= 24) { alarmHour = 0; }
                  break;
                case Mode::ALARM_MINUTE:
                  alarmMinute++;
                  if (alarmMinute >= 60) { alarmMinute = 0; }
                  break;
                default: break;
              }
            }
            else if (buttonAction == BUTTON_LONG_PRESSED_IND) {
              alarmEnabled = !alarmEnabled;
              if (alarmEnabled) digitalWrite(LED_2_PIN, LOW);
              else digitalWrite(LED_2_PIN, HIGH);
            }
            else if (buttonAction == BUTTON_LONG_RELEASE_IND) {
              MFS.blinkLeds(LED_4_PIN, 50, true);
            }
            else if (buttonAction == BUTTON_PRESSED_IND) {MFS.blinkLeds(LED_4_PIN, 50, true); }
            break;
          case 3:
            if (buttonAction == BUTTON_SHORT_RELEASE_IND) { }
            else if (buttonAction == BUTTON_LONG_PRESSED_IND) {
              if (clockMode == Mode::CLOCK) {
                clockMode = Mode::ALARM_HOUR;
                digitalWrite(LED_4_PIN, LOW);
              }
              else if (clockMode == Mode::ALARM_HOUR) {
                clockMode = Mode::ALARM_MINUTE;
                MFS.blinkLeds(LED_4_PIN, 50, true);
                digitalWrite(LED_4_PIN, LOW);
              }
              else if (clockMode == Mode::ALARM_MINUTE) {
                clockMode = Mode::CLOCK;
                digitalWrite(LED_4_PIN, HIGH);
              };
            }
            else if (buttonAction == BUTTON_LONG_RELEASE_IND) { }
            else if (buttonAction == BUTTON_PRESSED_IND) { }
            break;
        }
      }
    }
  }
}
