#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#include <IRremote.h>
#include <dht.h>
#include <RTClib.h>

// Khai báo cấu hình
#define I2C_ADDR    0x27
#define LCD_COLUMNS 16
#define LCD_LINES   2



#define PIN_LED 13
#define DHT22_PIN 11

RTC_DS3231 rtc;
dht DHT;

LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);

const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);

String correctCode = "1234";
String manageCode = "0000";
//bool isLocked = true;
bool LED = false;
// Danh sách ID và trạng thái điểm danh
const int userCount = 3;
String userList[userCount] = {"1001", "1002", "1003"};
bool attendanceStatus[userCount] = {false, false, false};



// Hiển thị trạng thái điểm danh
void displayAttendance() {
  //khi nhấn nút trên điều khiển thì sẽ hiển thị

  lcd.clear();
  lcd.print("Diem danh:");
  for (int i = 0; i < userCount; i++) {
    lcd.setCursor(0,1);
    lcd.print(userList[i] + ": ");
    lcd.print(attendanceStatus[i] ? "OK" : "Chua");
    delay(2000);
    lcd.clear();
  }
}


// Điểm danh với ID
void saveAttendance(String id) {
  lcd.clear();
  bool found = false;
  for (int i = 0; i < userCount; i++) {
    if (userList[i] == id) {
      found = true;
      if (!attendanceStatus[i]) {
        attendanceStatus[i] = true; // Cập nhật trạng thái
        lcd.print("ID: " + id);
        lcd.setCursor(0, 1);
        lcd.print("Diem danh OK!");
      } else {
        lcd.print("ID: " + id);
        lcd.setCursor(0, 1);
        lcd.print("Da diem danh!");
      }
      break;
    }
  }
  if (!found) {
    lcd.print("ID khong hop le!");
  }
  delay(2000);
  lcd.clear();
}

// Xử lý nhập mã điểm danh
void processAttendance() {
  lcd.clear();
  lcd.print("Nhap ID:");
  String enteredID = "";
  while (true) {
    char key = keypad.getKey();
    if (key == '#') { // Hủy nhập
      lcd.clear();
      return;
    } else if (key == 'D') { // Xác nhận ID
    if (enteredID.length() > 0){
        saveAttendance(enteredID);
        return;
      }
    } else if (key >= '0' && key <= '9') { // Nhập số
      enteredID += key;
      lcd.setCursor(0, 1);
      lcd.print(enteredID);
    }
  }
}

// Xử lý nhập mật khẩu mở khóa
void processPassword() {
    
    lcd.clear();
    lcd.print("Enter Code:");
    String enteredCode = "";
    while (enteredCode.length() < 4) {
      char key = keypad.getKey();
      if (key && key >= '0' && key <= '9') {
        enteredCode += key;
        lcd.print('*');
      }
    }
    if(enteredCode == manageCode){
      displayAttendance();
    }
    else if (enteredCode == correctCode) {
      //unlock();
      lcd.clear();
      lcd.print("Unlocked!");
      delay(1000);
      processAttendance(); // Gọi điểm danh sau khi mở khóa
    } else {
      lcd.clear();
      lcd.print("Wrong Code!");
      delay(1000);
    }
  
}



void setup() {
  lcd.begin(LCD_COLUMNS, LCD_LINES);
  pinMode(PIN_LED, OUTPUT);
  //lock();
  lcd.print("Welcome!");
  delay(1000);
  lcd.clear();
}

void loop() {

  processPassword();
  
}