// RFID-Bibiothek (mfrc522)
# include <MFRC522.h>
// Anschlüsse definieren
# define CS1 10 // Chip Select
# define RST 9 // Reset
# define LED_GR 8
# define LED_GE 7
# define LED_RT 6
# define TASTER_ausgabe 5
# define TASTER_eingabe 4
// MOSI => 11 // Master Out/Slave In
// MISO => 12 // Master In /Slave Out
// SCK => 13 // Serial Clock
// RFID-Empfänger benennen
MFRC522 mfrc522(CS1, RST);

const int MAX = 1;
struct Buch {
  String titel;
  String autor;
  String id;
  bool ausgeliehen;
};

Buch buecher[MAX];
int buchCount = 0;
bool gefunden = false;
bool unknown = false;
int element = 0;

void neuesBuch() {
  digitalWrite(LED_GR, LOW);
  digitalWrite(LED_GE, LOW);
  digitalWrite(LED_RT, HIGH);
  Serial.println("----------------------------------------------------");
  Serial.println("Neues Buch einlesen");
  Serial.println("Buchtitel: ");
  while (!Serial.available()) {
    ;
  }
  buecher[buchCount].titel = Serial.readString();
  Serial.println(buecher[buchCount].titel);
  Serial.println("Autor: ");
  while (!Serial.available()) {
    ;
  }
  buecher[buchCount].autor = Serial.readString();
  Serial.println(buecher[buchCount].autor);
  buecher[buchCount].ausgeliehen = false;
  Serial.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  Serial.println("Folgendes Buch wurde aufgenommen:");
  Serial.print("Titel: ");
  Serial.println(buecher[buchCount].titel);
  Serial.print("Autor: ");
  Serial.println(buecher[buchCount].autor);
  Serial.print("ID:");
  Serial.println(buecher[buchCount].id);
  Serial.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  buchCount += 1;
  digitalWrite(LED_GR, LOW);
  digitalWrite(LED_GE, LOW);
  digitalWrite(LED_RT, LOW);
}
void ausgabeBib() {
  digitalWrite(LED_GR, LOW);
  digitalWrite(LED_GE, LOW);
  digitalWrite(LED_RT, LOW);
  Serial.println("****************************************************");
  switch (buchCount) {
    case 0:
      Serial.println("Aktuell sind keine Buecher registriert :(");
      break;
    case 1:
      Serial.println("Aktuell ist nur folgendes Buch registriert:");
      break;
    default:
      Serial.print("Aktuell sind folgende ");
      Serial.print(buchCount);
      Serial.println(" Buecher registriert:");
      break;
  }

  for (int j = 0; j < buchCount; j++) {
    Serial.println("****************************************************");
    Serial.print("Buch ");
    Serial.print(j + 1);
    Serial.println(":");
    Serial.print("Buchtitel: ");
    Serial.println(buecher[j].titel);
    Serial.print("Autor: ");
    Serial.println(buecher[j].autor);
    Serial.print("ID :");
    Serial.println(buecher[j].id);
    Serial.print("Status: ");
    if (buecher[j].ausgeliehen == true) {
      Serial.println(" ausgeliehen");
    }
    else {
      Serial.println(" nicht ausgeliehen");
    }
  }
  Serial.println("****************************************************");

}

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  // Initialisierung des RFID-Empfängers
  mfrc522.PCD_Init();

  pinMode(LED_GR, OUTPUT);
  pinMode(LED_GE, OUTPUT);
  pinMode(LED_RT, OUTPUT);
  pinMode(TASTER_ausgabe, INPUT_PULLUP);
  pinMode(TASTER_eingabe, INPUT_PULLUP);

  digitalWrite(LED_GR, LOW);
  digitalWrite(LED_GE, LOW);
  digitalWrite(LED_RT, LOW);
  Serial.println("***********************************************************************");
  Serial.println("*                       RFID-Buchverwaltung                           *");
  Serial.println("*  Zum Einlesen neuer Buecher druecken Sie den entsprechenden Taster  *");
  Serial.println("***********************************************************************");
  Serial.println(" ");
}
void loop()
{
  String WertHEX = " ";
  String WertDEZ = " ";
  gefunden = false;
  unknown = false;
  if (digitalRead(TASTER_eingabe) == LOW) {
    Serial.println("Bitte legen Sie ein Buch auf den Scanner");
    while (!mfrc522.PICC_IsNewCardPresent() or !mfrc522.PICC_ReadCardSerial()) {
      ;
    }
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      WertDEZ = WertDEZ + String(mfrc522.uid.uidByte[i], DEC) + " ";
    }
    //Serial.println("ID eingelesen");
    for (int a = 0; a <= buchCount; a++) {
      if (WertDEZ == buecher[a].id) {
        gefunden = true;
        element = a;
        break;
      }
      else {
        unknown = true;
      }
    }
    if (gefunden == true) {
      if (buecher[element].ausgeliehen == false) {
        buecher[element].ausgeliehen = true;
        digitalWrite(LED_GR, LOW);
        digitalWrite(LED_GE, HIGH);
        digitalWrite(LED_RT, LOW);
        Serial.println("----------------------------------------------------");
        Serial.print("Buch ");
        Serial.print(element + 1);
        Serial.print(": ");
        Serial.println(buecher[element].titel);
        Serial.print("Autor: ");
        Serial.println(buecher[element].autor);
        Serial.println("Status: ausgeliehen");
        Serial.println("----------------------------------------------------");
        gefunden = false;
        unknown = false;
      }
      else {
        buecher[element].ausgeliehen = false;
        digitalWrite(LED_GR, HIGH);
        digitalWrite(LED_GE, LOW);
        digitalWrite(LED_RT, LOW);
        Serial.println("----------------------------------------------------");
        Serial.print("Buch ");
        Serial.print(element + 1);
        Serial.print(": ");
        Serial.println(buecher[element].titel);
        Serial.print("Autor: ");
        Serial.println(buecher[element].autor);
        Serial.println("Status: nicht ausgeliehen");
        Serial.println("----------------------------------------------------");
        gefunden = false;
        unknown = false;
      }
    }
    if (unknown == true && buchCount >= MAX) {
      digitalWrite(LED_GR, LOW);
      digitalWrite(LED_GE, LOW);
      digitalWrite(LED_RT, HIGH);
      Serial.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
      Serial.println("Die maximale Kapazitaet wurde erreicht, es koennen keine neuen Buecher registriert werden.");
      Serial.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    }
    if (unknown == true && buchCount < MAX) {
      buecher[buchCount].id = WertDEZ;
      neuesBuch();
    }

  }
  if (digitalRead(TASTER_ausgabe) == LOW) {
    ausgabeBib();
  }
  delay(50);
}