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

// Definición de pines para el sensor de temperatura y el botón
const int buttonPin = 7; // Pin del botón
const int tempSensorPin = A1; // Pin del sensor de temperatura

// Inicialización de los LCDs
LiquidCrystal_I2C lcdHorno(0x27, 16, 2); // LCD para el horno
LiquidCrystal_I2C lcdEstado(0x26, 16, 2); // LCD para el estado del juego

// Estructura para recetas
struct Recipe {
  float temp;   // temperatura en grados Celsius
  unsigned long time; // tiempo en segundos para mantener la temperatura
};

Recipe currentRecipe;
unsigned long startTime;
boolean recipeActive = false;

// Variables de juego
unsigned long gameStartTime;
const unsigned long gameDuration = 120000; // Duración del juego en milisegundos (2 minutos)
boolean gameRunning = false;
int score = 0; // Puntuación para el horno
int successfulBakes = 0; // Contador de horneados exitosos

void setup() {
  Serial.begin(9600);
  lcdHorno.init(); // Inicializa el LCD del horno
  lcdEstado.init(); // Inicializa el LCD de estado
  lcdHorno.backlight();
  lcdEstado.backlight();

  lcdEstado.clear();
  lcdEstado.print("Baking Chaos!");
  delay(2000);

  pinMode(buttonPin, INPUT_PULLUP);

  startGame();
}

void loop() {
  if (gameRunning) {
    unsigned long currentTime = millis();
    if (currentTime - gameStartTime > gameDuration) {
      endGame();
    } else {
      lcdHorno.setCursor(0, 0);
      lcdHorno.print(readTemperature());
      if (digitalRead(buttonPin) == LOW) {
        checkRecipe();
      }
    }
  }
}

void startGame() {
  gameStartTime = millis();
  gameRunning = true;
  setRandomRecipe();
  //updateGameState();
}

void endGame() {
  gameRunning = false;
  lcdEstado.clear();
  lcdEstado.print("Game Over");
  lcdEstado.setCursor(0, 1);
  lcdEstado.print("Score: ");
  lcdEstado.print(score);
}

void setRandomRecipe() {
  currentRecipe.temp = random(150, 251); // Temperatura aleatoria entre 150 y 250
  currentRecipe.time = random(10, 21); // Tiempo aleatorio entre 10 y 20 segundos
  lcdHorno.clear();
  lcdHorno.print("Set Temp: ");
  lcdHorno.print(currentRecipe.temp);
  lcdHorno.setCursor(0, 1);
  lcdHorno.print("Time: ");
  lcdHorno.print(currentRecipe.time);
  lcdHorno.print("s");
}

void checkRecipe() {
  float currentTemp = readTemperature();
  if (!recipeActive) {
    if (abs(currentTemp - currentRecipe.temp) <= 5) { // Tolerancia de temperatura
      startTime = millis();
      recipeActive = true;
    }
  } else {
    if (abs(currentTemp - currentRecipe.temp) > 5) {
      recipeActive = false; // Reset si la temperatura varía mucho
    } else if (millis() - startTime >= currentRecipe.time * 1000) {
      score += 50; // Otorga puntos
      successfulBakes++; // Incrementa el contador de horneados exitosos
      lcdEstado.clear();
      lcdEstado.print("Perfect Bake!");
      //updateGameState();
      recipeActive = false;
      setRandomRecipe(); // Nueva receta
    }
  }
}

float readTemperature() {
  int reading = analogRead(tempSensorPin);
  float voltage = reading * 5.0 / 1024.0;
  return (voltage - 0.5) * 100.0;
}