#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int press = 0 ;
#define coinSlotPin 2
const int mDrivePin = 4;
const int pauseStartPin = 5;
const int potPin = A0;
unsigned long startTime = 0;
float coinTime = 0;
bool motorRunning = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
bool lastButtonState = HIGH;  // Previous button state
volatile float coinTimeTotal = 0;
volatile float TimeTotal = 0;
volatile bool inserted = false;
bool startPause = false;
bool settings = false;
void setup() {
  pinMode(coinSlotPin, INPUT_PULLUP);
  pinMode(pauseStartPin, INPUT_PULLUP);
  pinMode(mDrivePin, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(coinSlotPin), coinSlotISR, FALLING);
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  // lcd.setCursor(0, 0);
  // lcd.print("   Alkasaur");
  // lcd.setCursor(0, 1);
  // lcd.print("  Water System");
  // delay(3000);
  // lcd.clear();
  // lcd.setCursor(0, 0);
  // lcd.print("  09959100730");
  // lcd.setCursor(0, 1);
  // lcd.print("  09531333303");
  // delay(3000);
  lcd.clear();
  int counter = 3;
  while (1) {
    lcd.setCursor(0, 0);
    lcd.print("Set Time ??");
    lcd.setCursor(0, 1);
    lcd.print("Press in " + String(counter));
    press = digitalRead(pauseStartPin);
    Serial.println(press);
    delay(1000);
    counter -= 1;
    if (!press || counter == 0) {
      lcd.clear();
      if (!press) {
        lcd.setCursor(0, 0);
        lcd.print("Going To Setting");
        settings = true;
      } else {
        lcd.setCursor(0, 0);
        lcd.print("Exit Settings");
      }
      break;
    }
  }
  delay(1000);
  if (settings) {
    lcd.setCursor(0, 0);
    lcd.print("Release Button !!");
    delay(2000);
    lcd.clear();
    while (1) {
      int potValue = analogRead(potPin);
      //coinTime = map(potValue, 0, 1023, 0.01, 20.0);
      coinTime = map(potValue, 0, 1023, 1, 60); // 1000.0; //
      lcd.setCursor(0, 0);
      lcd.print("Value: " + String(coinTime) + " Sec");
      press = digitalRead(pauseStartPin);
      if (!press) {
        EEPROM.put(1, coinTime);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Valus saved as ");
        lcd.setCursor(0, 1);
        lcd.print(String(coinTime) + " Sec" + " /Peso");
        break;
      }
    }
  }
  EEPROM.get(1, coinTime);
  Serial.println("Setting Done ");
  Serial.print("Time Value ");
  Serial.println(coinTime);
  delay(2000);
  lcd.clear();
}
void loop() {
  if (!coinTimeTotal) {
    lcd.setCursor(0, 0);
    lcd.print("PLS. INSERT COIN");
    lcd.setCursor(0, 1);
    lcd.print(" P1 P5 P10 P20");
  } else {
    if (inserted) {
      lcd.clear();
    }
    if (inserted) {
      lcd.setCursor(0, 0);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print(" CREDIT BALANCE");
      lcd.setCursor(0, 1);
      lcd.print("PHP: " + String(coinTimeTotal / coinTime) + " ");
      inserted = false;
      startPause = true;
      delay(200);
    }
    if (startPause) {
      lcd.setCursor(0, 0);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print("  PRESS START");
      lcd.setCursor(0, 1);
      lcd.print("PHP: " + String(coinTimeTotal / coinTime) + " ");
      startPause = false;
    }
    lcd.setCursor(0, 1);
    lcd.print("PHP: " + String(coinTimeTotal / coinTime) + " ");
  }
  // Serial.println(coinTimeTotal);
  // Serial.println(coinTime);
  // Check pause/start button state and debounce
  int buttonState = digitalRead(pauseStartPin);
  if (buttonState != lastButtonState) {  // Button state changed
    if (buttonState == HIGH && (millis() - lastDebounceTime) > debounceDelay) {
      // Button released, toggle timer and motor
      motorRunning = !motorRunning;
      Serial.print("Button Released ");
      Serial.println(motorRunning);
      lastDebounceTime = millis();
    }
    lastButtonState = buttonState;
  }
  starStoptMotor();
}
void coinSlotISR() {
  coinTimeTotal += coinTime;
  inserted = true;
  Serial.print("Inserted: ");
  Serial.println(coinTimeTotal);
}
void starStoptMotor() {
  if (motorRunning && coinTimeTotal > 0) {
    Serial.println(motorRunning);
    coinTimeTotal -= .1;
  }
  if (coinTimeTotal < 0) {
    motorRunning = false;
    coinTimeTotal = 0;
  }
  digitalWrite(mDrivePin, motorRunning);
  // delay(78);
  delay(100);
}