#include <SevSeg.h>
SevSeg sevseg; //Instanciamos el objeto SevSeg
#include "GFButton.h"
GFButton btn1 = GFButton(A0); //TIEMPO
//GFButton btn2 = GFButton(A1); //ACEPTAR CONFIGURACION
//GFButton btn3 = GFButton(A4); //WINNER
GFButton btnexp1 = GFButton(A3); // DETONADORES
GFButton btnexp2 = GFButton(A4); // DETONADORES
GFButton btnexp3 = GFButton(A5); // DETONADORES
const int RELAY_PIN = A1;     //RELAY 
const int pinBuzzer = A2;     //BOCINA



int result; //PING
static int STATUSBUTTON = 1;
static int COMPARASTATUS=0;
static int VALIDASTATUS=0;
static int COMPARABOTON=0;

#define NOTE_G3  196
#define NOTE_DS5 622
#define NOTE_D5  587
#define NOTE_CS5 554
#define NOTE_E4  330
#define NOTE_G4  392
#define NOTE_E5  659
#define NOTE_C5  523
#define NOTE_G5  784
unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 1000;
static int TIEMPO=0;
static int CONFIGURACION=1;
static int WINNER=1;
static int CERO=0;
static int contador=0;
static int REINICIO=0;
static int RESTA=0;
static int MIN=0;

void setup() {
  byte Numdigits=4;
  byte Comunes[]={2,3,4,5};
  byte Segmentos[]={6,7,8,9,10,11,12,13};
  byte Tipo=COMMON_CATHODE;
  btn1.setPressHandler(button1_on_hold);
  btn1.setHoldHandler(button2_on_hold);
  btnexp1.setReleaseHandler(btnexp1_on_hold);
  btnexp2.setReleaseHandler(btnexp2_on_hold);
  btnexp3.setReleaseHandler(btnexp3_on_hold);
  
  pinMode(RELAY_PIN, OUTPUT);
  Serial.begin(9600);
  Serial.println("Welcome to the Serial Monitor!");
  Serial.println("---------------------------------");
  sevseg.begin(Tipo,Numdigits,Comunes,Segmentos);
  sevseg.setBrightness(0);
}

void loop() {
  result=random(1,4);
  if (STATUSBUTTON==0){
    Serial.print("******* : ");
    Serial.println(result);
    switch(result){
      case 1: //case result = 0
        Serial.println("00000");
        COMPARASTATUS=1;
        break;
      case 2: //case result = 1
        Serial.println("11111");
        COMPARASTATUS=2;
        break;
      case 3: //case result = 2
        Serial.println("22222");  
        COMPARASTATUS=3;      
        break;
    }
    STATUSBUTTON=1;
  }
  if (TIEMPO==0){
    btn1.process();
  }
  if (WINNER==0){
    btnexp1.process();
    btnexp2.process();
    btnexp3.process();
  }
  if (VALIDASTATUS == 1){
    if (COMPARASTATUS == COMPARABOTON){
      GANADO();
    }
    if (COMPARASTATUS != COMPARABOTON){
      PIERDE();
    }
  }
  if (CERO==0){
    Serial.print("Entra a 0 - ");
    Serial.println(COMPARASTATUS);
    sevseg.setNumber(0,2);
    delay(300);
    sevseg.setBrightness(10);
    TIEMPO=0;
  }
  if (CERO==1){
    noTone(pinBuzzer);
    currentMillis = millis();
    if(currentMillis - startMillis >= period){
      Serial.print("Entra a 1 - ");
      Serial.println(COMPARASTATUS);
      if (RESTA==1){
        if (contador>60){
          contador=contador-40;
        }
        RESTA=0;
        MIN=0;
      }
      
      MIN++;
      if (MIN==60){
        if (contador>60){
          contador=contador-40;
        }
        MIN=0;
      }
      if(contador<=30){
        tone(pinBuzzer,NOTE_G3);
        Serial.print("Menos de 30: ");
        Serial.println(contador);
      }
      if(contador>0){
        contador--;
        //tiempoejec+=1000;
      }
      else{
        PIERDE();
        Serial.println("******************");
        Serial.println("QUEMAR TODO");
        Serial.println("******************");
      }
      sevseg.setNumber(contador,2);
      startMillis = currentMillis; 
    }
  }
  if (CERO==2){
    Serial.print("Entra a 2 - ");
    Serial.println(COMPARASTATUS);
    sevseg.setNumber(contador,2);
    static unsigned long tiempo2=millis()+500; //proximo evento
    if(millis()>=tiempo2){
      noTone(pinBuzzer);
    }  
  }
  if (CERO==3){
    Serial.print("Entra a 3 - ");
    Serial.println(COMPARASTATUS);
    //sevseg.setNumber(contador,2);
    //noTone(pinBuzzer);
    digitalWrite(RELAY_PIN, LOW);
  }
  //Serial.print(contador);
  sevseg.refreshDisplay();
}

void button1_on_hold(GFButton & button) {// TIEMPO
  if (REINICIO == 0){
    contador=0;
    REINICIO++;
  }
  noTone(pinBuzzer);
  contador=contador+100;
  CERO=2;
  tone(pinBuzzer,NOTE_G3);
  CONFIGURACION=0;
  WINNER=1;
  digitalWrite(RELAY_PIN, LOW);
}

void button2_on_hold(GFButton & button) {//ACEPTAR CONFIGURACION
  if (button.isFirstHold())
  {
    RESTA=1;
  }
  tone(pinBuzzer, NOTE_DS5);
  delay(300);
  tone(pinBuzzer, NOTE_D5);
  delay(300);
  tone(pinBuzzer, NOTE_CS5);
  delay(300);
  CONFIGURACION=1;
  TIEMPO=1;
  CERO=1; 
  WINNER=0;
  STATUSBUTTON=0;
  
}

void btnexp1_on_hold(GFButton & button){
  COMPARABOTON=1;
  VALIDASTATUS=1;
  Serial.println("-- 1 --");
}

void btnexp2_on_hold(GFButton & button){
  Serial.println("-- 2 --");
  COMPARABOTON=2;
  VALIDASTATUS=1;
}

void btnexp3_on_hold(GFButton & button){
  Serial.println("-- 3 --");
  COMPARABOTON=3;
  VALIDASTATUS=1;
}

void PIERDE(){
  CERO=0;
  MIN=0;
  digitalWrite(RELAY_PIN, HIGH);
  tone(pinBuzzer,440);
  VALIDASTATUS=1;
}

//void button3_on_hold(GFButton & button) //WINNER
void GANADO(){
    CERO=3;
    TIEMPO=0;
    WINNER=1;
    VALIDASTATUS=0;
    REINICIO=0;
    tone(pinBuzzer, NOTE_E4); //
    delay(150);
    tone(pinBuzzer, NOTE_G4); //
    delay(150);
    tone(pinBuzzer, NOTE_E5);//
    delay(150);
    tone(pinBuzzer, NOTE_C5); //
    delay(150);
    tone(pinBuzzer, NOTE_D5);  //esta
    delay(150);
    tone(pinBuzzer, NOTE_G5);
    delay(150);
    noTone(pinBuzzer); 
}
NOCOMNCVCCGNDINLED1PWRRelay Module