#include <TaskScheduler.h>
#include <NewPing.h>

// Define pin numbers
const int ledPlayerRock = 2;
const int ledPlayerPaper = 3;
const int ledPlayerScissors = 4;
const int buttonRock = 5;
const int buttonPaper = 6;
const int buttonScissors = 7;
const int ledArduinoRock = 8;
const int ledArduinoPaper = 9;
const int ledArduinoScissors = 10;
const int ledRGBResultRed = 11;
const int ledRGBResultGreen = 12;
const int ledRGBResultBlue = 13;
const int triggerPin1 = A0;
const int echoPin1 = A1;
const int triggerPin2 = A2;
const int echoPin2 = A3;
const int motorPin = A4;


// Define task intervals
const unsigned long distanceCheckInterval = 500;

// Initialize Scheduler
Scheduler scheduler;

// Define tasks
Task distanceCheckTask(distanceCheckInterval, TASK_FOREVER, &distanceCheck);

// Define HC-SR04 sensors
NewPing sonar1(triggerPin1, echoPin1);
NewPing sonar2(triggerPin2, echoPin2);

void setup() {
  // Initialize pin modes
  pinMode(ledPlayerRock, OUTPUT);
  pinMode(ledPlayerPaper, OUTPUT);
  pinMode(ledPlayerScissors, OUTPUT);
  pinMode(buttonRock, INPUT_PULLUP);
  pinMode(buttonPaper, INPUT_PULLUP);
  pinMode(buttonScissors, INPUT_PULLUP);
  pinMode(ledArduinoRock, OUTPUT);
  pinMode(ledArduinoPaper, OUTPUT);
  pinMode(ledArduinoScissors, OUTPUT);
  pinMode(ledRGBResultRed, OUTPUT);
  pinMode(ledRGBResultGreen, OUTPUT);
  pinMode(ledRGBResultBlue, OUTPUT);
  pinMode(motorPin, OUTPUT);

  // Start tasks
  scheduler.init();
  scheduler.addTask(distanceCheckTask);
  distanceCheckTask.enable();

  Serial.begin(9600);
 pinMode(motorPin, OUTPUT);

}

void loop() {
  scheduler.execute();
  checkPlayerInput();
}

void distanceCheck() {
  unsigned int distance1 = sonar1.ping_cm();
  unsigned int distance2 = sonar2.ping_cm();

  if (distance1 < 40 || distance2 < 40) {
    int motorSpeed = map(min(distance1, distance2), 0, 40, 255, 0); // Inverse mapping
    analogWrite(motorPin, motorSpeed);
    Serial.print("Motor Speed: ");
    Serial.println(motorSpeed);
  } else {
    analogWrite(motorPin, 0); // Arrêter le moteur
  }

  delay(100); // Laisser du temps entre les lectures
}

void checkPlayerInput() {
  if (digitalRead(buttonRock) == LOW) {
    digitalWrite(ledPlayerRock, HIGH);
    delay(500);
    digitalWrite(ledPlayerRock, LOW);
    playerChoice(0); // Rock
  }
  if (digitalRead(buttonPaper) == LOW) {
    digitalWrite(ledPlayerPaper, HIGH);
    delay(500);
    digitalWrite(ledPlayerPaper, LOW);
    playerChoice(1); // Paper
  }
  if (digitalRead(buttonScissors) == LOW) {
    digitalWrite(ledPlayerScissors, HIGH);
    delay(500);
    digitalWrite(ledPlayerScissors, LOW);
    playerChoice(2); // Scissors
  }
}








void playerChoice(int choice) {
  

  // Allumer la LED correspondant au choix du joueur
  switch (choice) {
    case 0: // Rock
      digitalWrite(ledPlayerRock, HIGH);
      digitalWrite(ledPlayerPaper, LOW);
      digitalWrite(ledPlayerScissors, LOW);
      break;
    case 1: // Paper
      digitalWrite(ledPlayerRock, LOW);
      digitalWrite(ledPlayerPaper, HIGH);
      digitalWrite(ledPlayerScissors, LOW);
      break;
    case 2: // Scissors
      digitalWrite(ledPlayerRock, LOW);
      digitalWrite(ledPlayerPaper, LOW);
      digitalWrite(ledPlayerScissors, HIGH);
      break;
  }

  // Attendre un court instant pour éviter les faux déclenchements
  delay(100);

  // Laisser le joueur relâcher le bouton
  while (digitalRead(buttonRock) == LOW || digitalRead(buttonPaper) == LOW || digitalRead(buttonScissors) == LOW);

  // L'Arduino choisit aléatoirement sa réponse
  int arduinoChoice = random(3); // 0: Rock, 1: Paper, 2: Scissors

  // Afficher les choix sur les LED
  displayChoices(choice, arduinoChoice);

  // Déterminer le résultat
  int result = determineWinner(choice, arduinoChoice);

  // Afficher le résultat sur la LED RVB
  displayResult(result);
}

void displayChoices(int playerChoice, int arduinoChoice) {
  // Allumer la LED correspondant au choix de l'Arduino
  switch (arduinoChoice) {
    case 0: // Rock
      digitalWrite(ledArduinoRock, HIGH);
      digitalWrite(ledArduinoPaper, LOW);
      digitalWrite(ledArduinoScissors, LOW);
      break;
    case 1: // Paper
      digitalWrite(ledArduinoRock, LOW);
      digitalWrite(ledArduinoPaper, HIGH);
      digitalWrite(ledArduinoScissors, LOW);
      break;
    case 2: // Scissors
      digitalWrite(ledArduinoRock, LOW);
      digitalWrite(ledArduinoPaper, LOW);
      digitalWrite(ledArduinoScissors, HIGH);
      break;
  }
}

int determineWinner(int playerChoice, int arduinoChoice) {
  // Pierre bat ciseaux, ciseaux bat papier, papier bat pierre
  if (playerChoice == arduinoChoice) {
    return 0; // Égalité
  } else if ((playerChoice == 0 && arduinoChoice == 2) || 
             (playerChoice == 1 && arduinoChoice == 0) || 
             (playerChoice == 2 && arduinoChoice == 1)) {
    return 1; // Le joueur gagne
  } else {
    return -1; // L'Arduino gagne
  }
}

void displayResult(int result) {
  // Éteindre la LED RVB
  analogWrite(ledRGBResultRed, 0);
  analogWrite(ledRGBResultGreen, 0);
  analogWrite(ledRGBResultBlue, 0);
  
  // Afficher le résultat sur la LED RVB
  if (result == 0) {
    // Égalité (blanc)
    analogWrite(ledRGBResultRed, 255);
    analogWrite(ledRGBResultGreen, 255);
    analogWrite(ledRGBResultBlue, 255);
  } else if (result == 1) {
    // Le joueur gagne (vert)
    analogWrite(ledRGBResultGreen, 255);
  } else {
    // L'Arduino gagne (rouge)
    analogWrite(ledRGBResultRed, 255);
  }
}

$abcdeabcde151015202530354045505560fghijfghij
$abcdeabcde151015202530354045505560fghijfghij