#include <TM1637Display.h>

// Initialisation des afficheurs 7 segments pour chaque joueur
TM1637Display display(11, 12); // CLK, DIO pour le joueur 1
TM1637Display display2(9, 8);  // CLK, DIO pour le joueur 2

// Boutons pour chaque joueur
int buttonPlayer1 = 5;
int buttonPlayer2 = 10;
int modeButton = 4; // Bouton pour choisir le mode de jeu

// Variables pour les compteurs de chaque joueur (en secondes)
int counterPlayer1 = 180;  // Par défaut : 3 minutes (180 secondes)
int counterPlayer2 = 180;  // Par défaut : 3 minutes (180 secondes)

// Rajouts de temps pour les modes avec incréments
int incrementPlayer1 = 0;
int incrementPlayer2 = 0;

unsigned long previousMillis = 0;  // Pour le chronométrage
const long interval = 1000;        // Intervalle d'une seconde

bool player1Turn = true;  // Indicateur pour savoir quel joueur joue
bool player2Turn = false;
bool gameStarted = false; // Indicateur pour savoir si le jeu a démarré

int gameMode = 0; // 0 = 3 min, 1 = 5 min + 2 sec, 2 = 10 min + 5 sec, 3 = 15 min + 10 sec

void setup() {
  // Configurer les broches des boutons comme entrées avec pullup
  pinMode(buttonPlayer1, INPUT_PULLUP);
  pinMode(buttonPlayer2, INPUT_PULLUP);
  pinMode(modeButton, INPUT_PULLUP);

  display.setBrightness(4); // Luminosité de 0 à 7
  display.clear();
  display2.setBrightness(4); // Luminosité de 0 à 7
  display2.clear();

  // Initialiser les deux afficheurs à 00:00
  display.showNumberDecEx(0, 0x40, true, 2, 0);  // Affiche "00"
  display2.showNumberDecEx(0, 0x40, true, 2, 0); // Affiche "00"
}

void loop() {
  if (!gameStarted) {
    // Choix du mode de jeu
    if (digitalRead(modeButton) == LOW) {
      delay(300); // Anti-rebond
      gameMode++;
      if (gameMode > 3) gameMode = 0; // Revenir au premier mode après le quatrième

      // Ajuster les compteurs et les incréments selon le mode sélectionné
      switch (gameMode) {
        case 0:
          counterPlayer1 = 180; // 3 minutes
          counterPlayer2 = 180;
          incrementPlayer1 = 0;
          incrementPlayer2 = 0;
          break;
        case 1:
          counterPlayer1 = 300; // 5 minutes
          counterPlayer2 = 300;
          incrementPlayer1 = 2; // +2 secondes
          incrementPlayer2 = 2;
          break;
        case 2:
          counterPlayer1 = 600; // 10 minutes
          counterPlayer2 = 600;
          incrementPlayer1 = 5; // +5 secondes
          incrementPlayer2 = 5;
          break;
        case 3:
          counterPlayer1 = 900; // 15 minutes
          counterPlayer2 = 900;
          incrementPlayer1 = 10; // +10 secondes
          incrementPlayer2 = 10;
          break;
      }

      // Afficher le temps initial sélectionné
      displayTime(counterPlayer1, display);
      displayTime(counterPlayer2, display2);
    }

    // Commencer le jeu lorsque l'un des boutons est pressé
    if (digitalRead(buttonPlayer1) == LOW || digitalRead(buttonPlayer2) == LOW) {
      gameStarted = true;
      previousMillis = millis(); // Réinitialiser le chronomètre
    }
  } else {
    unsigned long currentMillis = millis();

    // Vérifier si le bouton du joueur 1 est pressé
    if (digitalRead(buttonPlayer1) == LOW && !player1Turn) {
      player1Turn = true;
      player2Turn = false;
      counterPlayer1 += incrementPlayer1; // Ajouter les secondes supplémentaires
    }

    // Vérifier si le bouton du joueur 2 est pressé
    if (digitalRead(buttonPlayer2) == LOW && !player2Turn) {
      player1Turn = false;
      player2Turn = true;
      counterPlayer2 += incrementPlayer2; // Ajouter les secondes supplémentaires
    }

    // Compteur pour le joueur 1
    if (player1Turn && currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      if (counterPlayer1 > 0) {
        counterPlayer1--;
      }
      displayTime(counterPlayer1, display);
    }

    // Compteur pour le joueur 2
    if (player2Turn && currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      if (counterPlayer2 > 0) {
        counterPlayer2--;
      }
      displayTime(counterPlayer2, display2);
    }
  }
}

// Fonction pour afficher le temps au format "MM:SS"
void displayTime(int seconds, TM1637Display& display) {
  int minutes = seconds / 60;
  int remainingSeconds = seconds % 60;

  // Afficher le format MM:SS avec deux chiffres pour chaque partie
  display.showNumberDecEx(minutes * 100 + remainingSeconds, 0x40, true);
}
4-Digit Display
4-Digit Display