#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

int level = 0;
int my_1st_digit = 0;
int my_2nd_digit = 0;
int my_3rd_digit = 0;
int my_4th_digit = 0;
int pw_1st_digit = 1;
int pw_2nd_digit = 2;
int pw_3rd_digit = 3;
int pw_4th_digit = 4;





void clear_screen() {
  lcd.setCursor(0, 0);
   lcd.print("                    ");
   lcd.setCursor(0, 1);
   lcd.print("                    ");
   lcd.setCursor(0, 2);
   lcd.print("                    ");
   lcd.setCursor(0, 3);
   lcd.print("                    ");
   }

void home_screen() {
  clear_screen();
  lcd.setCursor(8, 0);
   lcd.print("Home");
   lcd.setCursor(3, 2);
   lcd.print("Tem Controller");
   }

void my_1st_digit_screen() {
  clear_screen();
  lcd.setCursor(3, 0);
   lcd.print("Enter Password");
   lcd.setCursor(8, 2);
   lcd.print(my_1st_digit);
   lcd.setCursor(9, 2);
   lcd.print("***");
   }

void my_2nd_digit_screen() {
  clear_screen();
  lcd.setCursor(3, 0);
   lcd.print("Enter Password");
   lcd.setCursor(8, 2);
   lcd.print("*");
   lcd.setCursor(9, 2);
   lcd.print(my_2nd_digit);
   lcd.setCursor(10, 2);
   lcd.print("**");
   }

void for_button() {
  if (!digitalRead(3) == true) {
    if (level == 0) {
      level = 10;
    } else if (level == 10) {
       my_1st_digit++ ;
       } else if (level == 11) {
       my_2nd_digit++ ;
       } else if (level == 12) {
       my_3rd_digit++ ;
       } else if (level == 13) {
       my_4th_digit++ ;
       }
    update_menu();
    delay(100);
    while (!digitalRead(3) == true){
    }
  }
  if (!digitalRead(4) == true) {
    if (level == 10) {
       my_1st_digit-- ;
       } else if (level == 11) {
       my_2nd_digit-- ;
       } else if (level == 12) {
       my_3rd_digit-- ;
       } else if (level == 13) {
       my_4th_digit-- ;
       }
    update_menu();
    delay(100);
    while (!digitalRead(4) == true){
    }
  }
  if (!digitalRead(6) == true) {
    if ((level == 10 | level == 11) | (level == 12 | level == 13)) {
      reset_digit();
      level = 0;
    } else if (level == 1) {
      level = 0;
    }
    update_menu();
    delay(100);
    while (!digitalRead(6) == true){
    }
  }
  if (!digitalRead(5) == true) {
    execute_action();
    update_menu();
    delay(100);
    while (!digitalRead(5) == true){
    }
  }
}

void update_menu() {
  if (level == 0) {
    home_screen();
  } else if (level == 1) {
    Final_Screen();
  } else if (level == 10) {
    if (my_1st_digit < 0) {
      my_1st_digit = 9;
    }
    if (my_1st_digit > 9) {
      my_1st_digit = 0;
    }
    my_1st_digit_screen();
  } else if (level == 11) {
    if (my_2nd_digit < 0) {
      my_2nd_digit = 9;
    }
    if (my_2nd_digit > 9) {
      my_2nd_digit = 0;
    }
    my_2nd_digit_screen();
  } else if (level == 12) {
    if (my_3rd_digit < 0) {
      my_3rd_digit = 9;
    }
    if (my_3rd_digit > 9) {
      my_3rd_digit = 0;
    }
    my_3rd_digit_screen();
  } else if (level == 13) {
    if (my_4th_digit < 0) {
      my_4th_digit = 9;
    }
    if (my_4th_digit > 9) {
      my_4th_digit = 0;
    }
    my_4th_digit_screen();
  }
}

void execute_action() {
  if (level == 10) {
    level = 11;
  } else if (level == 11) {
    level = 12;
  } else if (level == 12) {
    level = 13;
  } else if (level == 13) {
    if ((pw_1st_digit == my_1st_digit & pw_2nd_digit == my_2nd_digit) & (pw_3rd_digit == my_3rd_digit & pw_4th_digit == my_4th_digit)) {
      login_success_screen();
      delay(1*1000);
      reset_digit();
      level = 1;
    } else {
      login_fail_screen();
      delay(1*1000);
      reset_digit();
      level = 0;
    }
  }
}

void my_3rd_digit_screen() {
  clear_screen();
  lcd.setCursor(3, 0);
   lcd.print("Enter Password");
   lcd.setCursor(8, 2);
   lcd.print("**");
   lcd.setCursor(10, 2);
   lcd.print(my_3rd_digit);
   lcd.setCursor(11, 2);
   lcd.print("*");
   }

void my_4th_digit_screen() {
  clear_screen();
  lcd.setCursor(3, 0);
   lcd.print("Enter Password");
   lcd.setCursor(8, 2);
   lcd.print("***");
   lcd.setCursor(11, 2);
   lcd.print(my_4th_digit);
   }

void reset_digit() {
  my_1st_digit = 0;
  my_2nd_digit = 0;
  my_3rd_digit = 0;
  my_4th_digit = 0;
}

void Final_Screen() {
  clear_screen();
  lcd.setCursor(7, 2);
   lcd.print("WELCOME");
   }

void login_success_screen() {
  clear_screen();
  lcd.setCursor(7, 2);
   lcd.print("Success");
   }

void login_fail_screen() {
  clear_screen();
  lcd.setCursor(1, 2);
   lcd.print("Incorrect Password");
   }


void setup() {
  lcd.init();
 lcd.backlight();

    home_screen();

  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
}

void loop() {
    for_button();

}