#define pinLatch 4
#define pinClk 7
#define pinData 8
#define pinLed 13
#define pinBuzzer 3

bool countdown = false;
unsigned long startMillis; 
unsigned long currentMillis;
const unsigned long buttonDelay = 250;
const unsigned long period = 1000;
const byte mapSegment[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
const byte mapDigit[] = {0xF1,0xF2,0xF4,0xF8};
int timer = 0;

void setup () {
  pinMode(pinLatch, OUTPUT);
  pinMode(pinClk, OUTPUT);
  pinMode(pinData, OUTPUT);
  pinMode(pinLed, OUTPUT);
  digitalWrite(pinLed, HIGH);
  WriteNumberToDisplay(timer);
}

void WriteNumberToSegment(byte Segment, byte Value) {
  digitalWrite(pinLatch, LOW);
  shiftOut(pinData, pinClk, MSBFIRST, mapSegment[Value]);
  shiftOut(pinData, pinClk, MSBFIRST, mapDigit[Segment] );
  digitalWrite(pinLatch, HIGH);
}

void WriteSpaceToSegment(byte Segment) {
  digitalWrite(pinLatch, LOW);
  shiftOut(pinData, pinClk, MSBFIRST,0xFF);
  shiftOut(pinData, pinClk, MSBFIRST, mapDigit[Segment] );
  digitalWrite(pinLatch, HIGH);
}


void WriteNumberToDisplay(int number) {
  if (number>=1000) { WriteNumberToSegment(0 , number / 1000); } else {WriteSpaceToSegment(0);}
  if (number>=100) { WriteNumberToSegment(1 , (number / 100) % 10);} else {WriteSpaceToSegment(1);}
  if (number>=10) { WriteNumberToSegment(2 , (number / 10) % 10);} else {WriteSpaceToSegment(2);}
  WriteNumberToSegment(3 , number % 10);
}

void loop() {
  WriteNumberToDisplay(timer);
  currentMillis = millis();
  if (digitalRead(A1) == HIGH && (digitalRead(A2) == HIGH && (digitalRead(A3) == LOW && (timer > 0 && (countdown == false))))) {
    if (currentMillis - startMillis >= buttonDelay) {
      countdown = true;
      startMillis = currentMillis;
    }     
  }
  if (digitalRead(A1) == LOW && (digitalRead(A2) == LOW && (digitalRead(A3) == LOW))) {
        countdown = false;
        digitalWrite(pinLed, HIGH);
        startMillis = currentMillis;
    }
  if (countdown == true) {
    if (currentMillis - startMillis >= period && (timer > 0)) {
      digitalWrite(pinLed, !digitalRead(pinLed));
      timer --;
      if (timer == 0) {
        countdown = false;
        digitalWrite(pinLed, HIGH);
      }
      startMillis = currentMillis;
    }
  }
  if (countdown == false) {
    if (digitalRead(A1) == LOW) {
      if (currentMillis - startMillis >= buttonDelay) {
        timer ++;
        startMillis = currentMillis;
      }
      if (timer > 9999) {
        timer = 9999;
      }
    }
    if (digitalRead(A2) == LOW && (timer > 0)) {
      if (currentMillis - startMillis >= buttonDelay) {
        timer --;
        startMillis = currentMillis;
      }
    }
  }
}
