#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Configuration de l'écran I2C (adresse 0x27 et écran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Définir les boutons poussoirs
const int injuryButtonPin = 2;  // Bouton pour sélectionner la blessure
const int timerButtonPin = 3;   // Bouton pour démarrer le timer

int lastInjuryButtonState = HIGH;
int currentInjuryButtonState;
bool buttonPressed = false;

int lastTimerButtonState = HIGH;
int currentTimerButtonState = HIGH;

bool timerRunning = false;
bool injurySelected = false;  // Indique si une blessure a été sélectionnée
bool selectionLocked = false;  // Empêche un nouveau choix tant que le timer n'est pas fini
unsigned long timerStart = 0;
int randomTimerDuration = 0;
bool outSelected = false;  // Vérifie si "Out" a été sélectionné

// Les différentes blessures possibles
String injuries[] = {"Jambe", "Pied", "Main", "Bras", "Tête", "Out"};
int numInjuries = sizeof(injuries) / sizeof(injuries[0]);
String chosenInjury = "";

// Délai pour éviter les rebonds du bouton
const int debounceDelay = 50;

void setup() {
  // Initialisation de l'écran LCD
  lcd.init();
  lcd.backlight();
  
  // Configuration des boutons en entrée
  pinMode(injuryButtonPin, INPUT);
  pinMode(timerButtonPin, INPUT);
  
  // Message de bienvenue
  lcd.setCursor(6, 0);
  lcd.print("ROLE");
  lcd.setCursor(4, 1);
  lcd.print("MEDECIN");
}

void loop() {
  // Lecture de l'état du bouton blessure
  currentInjuryButtonState = digitalRead(injuryButtonPin);

  // Si le bouton blessure est pressé (sans timer en cours ni blessure verrouillée)
  if (currentInjuryButtonState == HIGH && lastInjuryButtonState == LOW && !timerRunning && !selectionLocked) {
    buttonPressed = true;
    delay(debounceDelay);  // Anti-rebond
  }

  // Si une blessure doit être sélectionnée
  if (buttonPressed) {
    // Choisir une blessure aléatoirement
    int randomIndex = random(0, numInjuries);
    chosenInjury = injuries[randomIndex];

    // Effacer l'écran et afficher la blessure choisie
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print("Blessure :");
    lcd.setCursor(0, 1);
    lcd.print(chosenInjury);

    // Si la blessure est "Out", on démarre un timer spécifique
    if (chosenInjury == "Out") {
      outSelected = true;
      timerStart = millis();
      timerRunning = true;
    } else {
      // Sinon, on sélectionne une blessure avec un timer aléatoire
      randomTimerDuration = random(10, 61);  // Timer aléatoire entre 10 et 60 secondes
      injurySelected = true;  // Blessure sélectionnée
      lcd.setCursor(12, 1);  // Affichage du temps initial
      lcd.print(randomTimerDuration);
      lcd.print("s");
    }
    
    selectionLocked = true;  // Verrouiller la sélection jusqu'à la fin du timer
    buttonPressed = false;   // Fin de la gestion de l'appui du bouton
  }

  // Mettre à jour l'état du bouton blessure
  lastInjuryButtonState = currentInjuryButtonState;

  // Lecture de l'état du bouton timer
  currentTimerButtonState = digitalRead(timerButtonPin);

  // Si le bouton timer est pressé (et le timer n'est pas déjà en cours)
  if (currentTimerButtonState == LOW && lastTimerButtonState == HIGH && !timerRunning && injurySelected) {
    timerStart = millis();  // Démarrer le timer
    timerRunning = true;
    delay(debounceDelay);  // Anti-rebond
  }

  // Si le bouton timer est relâché pendant que le timer est en cours, on réinitialise le timer
  if (timerRunning && currentTimerButtonState == HIGH && lastTimerButtonState == LOW) {
    timerRunning = false;  // Arrêter le timer
     delay(debounceDelay);  // Anti-rebond
    
  }

  // Mettre à jour l'état du bouton timer
  lastTimerButtonState = currentTimerButtonState;

  // Gestion du timer pour la blessure sélectionnée
  if (timerRunning && injurySelected) {
    unsigned long elapsedTime = (millis() - timerStart) / 1000;  // Temps écoulé en secondes
    int remainingTime = randomTimerDuration - elapsedTime;

    if (remainingTime <= 0) {
      // Timer terminé, réinitialisation
      timerRunning = false;
      injurySelected = false;
      selectionLocked = false;  // Permet de choisir une nouvelle blessure

      // Afficher message de remise en jeu
      lcd.clear();
      lcd.setCursor(5, 0);
      lcd.print("REMISE");
      lcd.setCursor(5, 1);
      lcd.print("EN JEU");
      delay(2000);  // Pause pour l'affichage
      lcd.clear();  // Nettoyer l'écran
      lcd.setCursor(6, 0);
  lcd.print("ROLE");
  lcd.setCursor(4, 1);
  lcd.print("MEDECIN");
    } else {
      // Mise à jour du temps restant sur l'écran
      lcd.setCursor(12, 1);
      lcd.print(remainingTime);
      lcd.print("s  ");  // Effacement du temps précédent
    }
  }

  // Gestion du timer pour le cas "Out" (30 secondes d'attente)
  if (outSelected && timerRunning) {
    unsigned long elapsedTime = (millis() - timerStart) / 1000;  // Temps écoulé en secondes
    int remainingTime = 30 - elapsedTime;

    if (remainingTime <= 0) {
      // Timer terminé pour "Out", réinitialisation
      timerRunning = false;
      outSelected = false;
      selectionLocked = false;  // Permet de choisir une nouvelle blessure
      injurySelected = false;

      // Afficher message de remise en jeu
      lcd.clear();
      lcd.setCursor(5, 0);
      lcd.print("RETOUR");
      lcd.setCursor(4, 1);
      lcd.print("AU SPAWN");
      delay(2000);  // Pause pour l'affichage
      lcd.clear();  // Nettoyer l'écran
      lcd.setCursor(6, 0);
  lcd.print("ROLE");
  lcd.setCursor(4, 1);
  lcd.print("MEDECIN");
    } else {
      // Mise à jour du temps restant pour "Out" sur l'écran
      lcd.setCursor(12, 1);
      lcd.print(remainingTime);
      lcd.print("s  ");
    }
  }
}