#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);

const int sopPin1 = 6;
const int sopPin2 = 7;

const int greenLED = 3;
const int redLED = 4;
const int buzzerPower = A5;

byte allowedUID[4] = {0x96, 0x95, 0xAA, 0x04};

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();

  pinMode(sopPin1, INPUT);
  pinMode(sopPin2, INPUT);

  pinMode(greenLED, OUTPUT);
  pinMode(redLED, OUTPUT);
  pinMode(buzzerPower, OUTPUT);

  digitalWrite(greenLED, LOW);
  digitalWrite(redLED, LOW);
  digitalWrite(buzzerPower, LOW);

  Serial.println("Vault System Ready");
}

void loop()
{
  // If either SOP output is LOW, keep red LED on and block RFID
  if (digitalRead(sopPin1) == LOW || digitalRead(sopPin2) == LOW)
  {
    digitalWrite(redLED, HIGH);
    digitalWrite(greenLED, LOW);
    digitalWrite(buzzerPower, LOW);
    return;
  }

  // Both SOP outputs are HIGH, so RFID is allowed
  digitalWrite(redLED, LOW);

  if (!rfid.PICC_IsNewCardPresent()) return;
  if (!rfid.PICC_ReadCardSerial()) return;

  Serial.print("Card UID: ");
  for (byte i = 0; i < rfid.uid.size; i++)
  {
    Serial.print(rfid.uid.uidByte[i], HEX);
    Serial.print(" ");
  }
  Serial.println();

  if (cardMatches())
  {
    Serial.println("ACCESS GRANTED");

    digitalWrite(greenLED, HIGH);
    successBeep();
    delay(1000);
    digitalWrite(greenLED, LOW);
  }
  else
  {
    Serial.println("ACCESS DENIED");

    digitalWrite(redLED, HIGH);
    failBeep();
    digitalWrite(redLED, LOW);
  }

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();

  delay(500);
}

bool cardMatches()
{
  for (int i = 0; i < 4; i++)
  {
    if (rfid.uid.uidByte[i] != allowedUID[i])
    {
      return false;
    }
  }
  return true;
}

void successBeep()
{
  digitalWrite(buzzerPower, HIGH);
  delay(150);
  digitalWrite(buzzerPower, LOW);
}

void failBeep()
{
  for (int i = 0; i < 3; i++)
  {
    digitalWrite(buzzerPower, HIGH);
    delay(250);
    digitalWrite(buzzerPower, LOW);
    delay(150);
  }
}