#include <RotaryEncoder.h>
#include <Wire.h>
#include "SevSeg.h" 



#define CLK 12
#define DT 11
#define SW 53
RotaryEncoder encoder(CLK, DT);


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Pinos dos botões
#define bt_eq1_mais 22
#define bt_eq1_menos 23
#define bt_eq2_mais 24
#define bt_eq2_menos 25

int pt_eq1 = 0;
int pt_eq2 = 0;

int set_eq1 = 0;
int set_eq2 = 0;

bool trocando_lados = false;

SevSeg sevseg1; 
SevSeg sevseg2; 
SevSeg sevseg3; 
SevSeg sevseg4; 



void setup() {
  Serial.begin(9600);

  byte numDigits = 2;
  
  byte digitPins[] = {2, 3};
  byte segmentPins[] = {4, 5, 6, 7, 8, 9, 10};

  byte digitPins2[] = {26, 28};
  byte segmentPins2[] = {29, 31, 32, 33, 34, 35, 36};

  byte digitPins3[] = {44};
  byte segmentPins3[] = {37, 38, 39, 40, 41, 42, 43};
  
  byte digitPins4[] = {45};
  byte segmentPins4[] = {46, 47, 48, 49, 50, 51, 52};

  
  bool resSeg = true; 
  byte config = COMMON_ANODE;
  bool upDelays = true; 
  bool leadingZeros = true; 
  bool decPoint = true; 

  sevseg1.begin(config, numDigits, digitPins, segmentPins, resSeg, upDelays, leadingZeros, decPoint);
  sevseg1.setBrightness(90);

  sevseg2.begin(config, 2, digitPins2, segmentPins2, resSeg, upDelays, leadingZeros, decPoint);
  sevseg2.setBrightness(90);

  sevseg3.begin(config, 1, digitPins3, segmentPins3, resSeg, upDelays, leadingZeros);
  sevseg3.setBrightness(90);

  sevseg4.begin(config, 1, digitPins4, segmentPins4, resSeg, upDelays, leadingZeros);
  sevseg4.setBrightness(90);

  
  lcd.init();
  lcd.setBacklight(HIGH);
  lcd.setCursor(0, 0);
  lcd.print("GIRE O PINO");
  lcd.setCursor(0, 1);
  lcd.print("ESCOLHA O MODO");

  pinMode(bt_eq1_mais, INPUT_PULLUP);
  pinMode(bt_eq1_menos, INPUT_PULLUP);

  pinMode(bt_eq2_mais, INPUT_PULLUP);
  pinMode(bt_eq2_menos, INPUT_PULLUP);

  pinMode(CLK, INPUT);
  pinMode(DT, INPUT);
  pinMode(SW, INPUT_PULLUP);
  

}

int pos = HIGH;
int modo = 0;
bool tiebreak = false;

bool quadra = false;
bool areia = false;

void loop() {
  sevseg1.setNumber(pt_eq1);
  sevseg2.setNumber(pt_eq2);
  sevseg3.setNumber(set_eq1);
  sevseg4.setNumber(set_eq2);

  sevseg1.refreshDisplay();
  sevseg2.refreshDisplay();
  sevseg3.refreshDisplay();
  sevseg4.refreshDisplay();

  int bt_estado = digitalRead(SW);
  int novaPos = digitalRead(CLK);
  if (novaPos != pos) {
    pos = novaPos;
    int DIO_val = digitalRead(DT);
    if (novaPos == LOW && DIO_val == HIGH) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("MODO");
      lcd.setCursor(0, 1);
      lcd.print("QUADRA");
      quadra = true;
      areia = false;
    }
    if (novaPos == LOW && DIO_val == LOW) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("MODO");
      lcd.setCursor(0, 1);
      lcd.print("AREIA");
      quadra = false;
      areia = true;
    }
  }

  if (bt_estado == LOW && quadra == true) {
    modo = 1;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("MODO QUADRA");
    lcd.setCursor(0, 1);
    lcd.print("SELECIONADO");
    delay(1000);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("EQUIPE 1 :");
    lcd.setCursor(0, 1);
    lcd.print("EQUIPE 2 :");
  }

  if (bt_estado == LOW && areia == true) {
    modo = 3;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("MODO AREIA");
    lcd.setCursor(0, 1);
    lcd.print("SELECIONADO");
    delay(1000);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("EQUIPE 1 :");
    lcd.setCursor(0, 1);
    lcd.print("EQUIPE 2 :");
  }

  switch (modo) {
//----------------------------------QUADRA------------------------------  
    case 1:
      if (pt_eq1 == 25 && pt_eq1 - pt_eq2 >= 2) {
        set_eq1++;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SET EQUIPE 1");
        delay(5000);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("FIM DO SET");
        delay(10000);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("EQUIPE 1 :");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 2 :");

        pt_eq1 = 0;

        lcd.setCursor(12, 0);
        lcd.print(set_eq1);
        lcd.setCursor(12, 1);
        lcd.print(set_eq2);
      }
      if (pt_eq2 == 25 && pt_eq2 - pt_eq1 >= 2) {
        set_eq2++;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SET EQUIPE 2");
        delay(5000);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("FIM DO SET");
        delay(30000);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("EQUIPE 1 :");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 2 :");

        pt_eq2 = 0;


        lcd.setCursor(12, 0);
        lcd.print(set_eq1);
        lcd.setCursor(12, 1);
        lcd.print(set_eq2);
      }

      if (set_eq1 == 3) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VITORIA");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 1");
        delay(10000);


      }
      if (set_eq2 == 3) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VITORIA");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 2");
        delay(10000);

        
      }
//---------------------------------TIEBREAK QUADRA--------------------
      else if (set_eq1 == 2 && set_eq2 == 2) {
        modo = 2;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("TIEBREAK");
        delay(5000);
        lcd.clear();

        pt_eq1 = 0;
        pt_eq2 = 0;
        set_eq1 = 0;
        set_eq2 = 0;
      }
      botao_controle();
      break;

    case 2:
      lcd.setCursor(0, 0);
      lcd.print("EQUIPE 1 :");
      lcd.setCursor(0, 1);
      lcd.print("EQUIPE 2 :");

      if (!trocando_lados && (pt_eq1 == 8 || pt_eq2 == 8)) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("TROCANDO LADOS");
        trocando_lados = true;
        delay(30000);
        lcd.clear();
      } else if (trocando_lados && pt_eq1 != 8 && pt_eq2 != 8) {
        trocando_lados = false;
      }

      if (pt_eq1 == 15 && pt_eq1 - pt_eq2 >= 2) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VITORIA");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 1");
        delay(10000);

        
      }
      if (pt_eq2 == 15 && pt_eq2 - pt_eq1 >= 2) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VITORIA");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 2");
        delay(10000);

        pt_eq2 = 0;
        
      }
      botao_controle();
      delay(50);
      break;
//--------------------------------AREIA--------------------------
    case 3:
      if (pt_eq1 == 21 && pt_eq1 - pt_eq2 >= 2) {
        set_eq1++;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SET EQUIPE 1");
        delay(5000);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("FIM DO SET");
        delay(30000);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("EQUIPE 1 :");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 2 :");

        pt_eq1 = 0;

       
      }
      if (pt_eq2 == 21 && pt_eq2 - pt_eq1 >= 2) {
        set_eq2++;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("SET EQUIPE 2");
        delay(5000);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("FIM DO SET");
        delay(30000);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("EQUIPE 1 :");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 2 :");

        pt_eq2 = 0;

       
      }

      if (set_eq1 == 2) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VITORIA");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 1");
        delay(10000);

        
      }
      if (set_eq2 == 2) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VITORIA");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 2");
        delay(10000);

        
      }
//---------------------------TIEBREAK AREIA-----------------------------
      else if (set_eq1 == 1 && set_eq2 == 1) {
        modo = 4;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("TIEBREAK");
        delay(5000);
        lcd.clear();

        pt_eq1 = 0;
        pt_eq2 = 0;
        set_eq1 = 0;
        set_eq2 = 0;
      }
      botao_controle();
      break;

    case 4:
      lcd.setCursor(0, 0);
      lcd.print("EQUIPE 1 :");
      lcd.setCursor(0, 1);
      lcd.print("EQUIPE 2 :");

      int x = (pt_eq1 + pt_eq2) % 7;

      if (!trocando_lados && x == 0) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("TROCANDO LADOS");
        trocando_lados = true;
        delay(30000);
        lcd.clear();
      } else if (trocando_lados && x != 0) {
        trocando_lados = false;
      }

      if (pt_eq1 == 15 && pt_eq1 - pt_eq2 >= 2) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VITORIA");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 1");
        delay(10000);

        
      }

      if (pt_eq2 == 15 && pt_eq2 - pt_eq1 >= 2) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("VITORIA");
        lcd.setCursor(0, 1);
        lcd.print("EQUIPE 2");
        delay(10000);

        pt_eq2 = 0;
        
      }
      botao_controle();
      delay(50);
      break;
  }
  
}

// ----------------------------FUNÇÃO CONTROLE DOS BOTOES-------------
void botao_controle(){
  if (!digitalRead(bt_eq1_mais)) {
        pt_eq1++;
    
        while (!digitalRead(bt_eq1_mais)) { 
        }
        delay(300);
      }
      
  if (!digitalRead(bt_eq1_menos)) {
    
    pt_eq1--;
  
    while (!digitalRead(bt_eq1_menos)) { 
    }
    delay(300);
  }
  if (!digitalRead(bt_eq2_mais)) {
    
    pt_eq2++;
  
    while (!digitalRead(bt_eq2_mais)) { 
    }
    delay(300);
  }
  if (!digitalRead(bt_eq2_menos)) {
    
    pt_eq2--;

    while (!digitalRead(bt_eq2_menos)) { 
    }
    delay(300);
  }
}