#include <iostream>
#include <cstdlib>

using namespace std;

class Person {
private:
    string vorname;
    string name;
    string strasse;
    unsigned int hausnr;
    string ort;
    unsigned int plz;
public:
    Person() {};
    void datenErfassen();
    void datenAusgeben();
};

void Person::datenErfassen()
{
    cout << "--Datenerfassung--" << endl;
    cout << "Vorname: ";
    cin >> vorname;
    cout << "Nachname: ";
    cin >> name;
    cout << "Strasse: ";
    cin >> strasse;
    cout << "Hausnummer: ";
    cin >> hausnr;
    cout << "PLZ: ";
    cin >> plz;
    cout << "Ort: ";
    cin >> ort;
    cout << endl << "Person erfasst." << endl;
}

void Person::datenAusgeben()
{
    cout << vorname << " " << name << endl;
    cout << strasse << " " << hausnr << endl;
    cout << plz << " " << ort << endl;
}

class Buch{
private:
    string titel;
    string autor;
public:
    Buch() {};
    Buch(string t,string a) : titel(t), autor(a) {};
    void datenAusgeben();
};

void Buch::datenAusgeben()
{
    cout << titel << " (von " << autor << ")";
}

class Datum{
private:
    short tag;
    short monat;
    unsigned int jahr;
public:
    void datumErfassen();
    void datenAusgeben();
    void umEinenMonatErhoehen();
};

void Datum::datumErfassen()
{
    cout << "Tag: ";
    cin >> tag;
    cout << "Monat: ";
    cin >> monat;
    cout << "Jahr: ";
    cin >> jahr;
}

void Datum::datenAusgeben()
{
    cout << tag << "." << monat << "." << jahr << endl;
}

void Datum::umEinenMonatErhoehen()
{
    if(monat == 12)
    {
        jahr = jahr+1;
        monat=(monat%12)+1;
    }
    else if(tag == 28 && monat == 2)
    {
        tag = 31;
        monat+=1;
    }
    else if(tag <= 28)
    {
        monat+=1;
    }
    else if(tag > 28 && tag <= 31 && monat == 1)
    {
        tag = 28;
        monat+=1;
    }
    else if(tag==31 && monat != 7)
    {
        switch (monat)
        {
            case 3:
            case 5:
            case 8:
            case 10:
                {
                    tag=30;
                    monat+=1;
                    break;
                }
        }
    }
    else if(tag==30)
    {
        switch (monat)
        {
            case 4:
            case 6:
            case 9:
            case 11:
                {
                    tag=31;
                    monat+=1;
                    break;
                }
        }
    }
    else
        monat+=1;
}

class Ausleihe {
private:
    Person ausleiher;
    Buch ausgeliehenesBuch;
    Datum rueckgabe;
    bool hat_buch;
public:
    Ausleihe() { hat_buch = false; };
    void datenErfassen(Person,Buch,Datum);
    void datenAusgeben();
    void verlaengere();
    void zurueckgeben();
    bool get_hat_buch();
};

void Ausleihe::datenErfassen(Person p, Buch b, Datum d)
{
    ausleiher = p;
    ausgeliehenesBuch = b;
    rueckgabe = d;
    hat_buch = true;
}

void Ausleihe::datenAusgeben()
{
    ausleiher.datenAusgeben();
    cout << endl << "Ausgeliehenes Buch: ";
    ausgeliehenesBuch.datenAusgeben();
    cout << endl << "Rueckgabe bis: ";
    rueckgabe.datenAusgeben();
}

void Ausleihe::verlaengere()
{
    rueckgabe.umEinenMonatErhoehen();
    cout << "Ausleihe um 1 Monat verlaengert." << endl;
}

void Ausleihe::zurueckgeben()
{
    cout << "Buch ";
    ausgeliehenesBuch.datenAusgeben();
    cout << " wurde zuruckgegeben." << endl;
    hat_buch = false;
}

bool Ausleihe::get_hat_buch()
{
    return hat_buch;
}

int main()
{
    Person p;
    int auswahl;
    Buch b[3] = {{"Titel 1", "Autor a"},{"Titel 2", "Autor b"},{"Titel 2", "Autor c"}};
    Ausleihe a;
    Datum d;

    p.datenErfassen();
    system("pause");

    do
    {
        system("cls");
        cout << "--MENUE--" << endl;
        cout << "[1] Personendaten erfassen" << endl;
        cout << "[2] Buch ausleihen" << endl;
        cout << "[3] Ausleihe verlaengern" << endl;
        cout << "[4] Daten ausgeben" << endl;
        cout << "[5] Buch zurueckgeben" << endl;
        cout << "[0] Beenden" << endl;
        cout << endl << "Auswahl: ";
        cin >> auswahl;
        switch(auswahl)
        {
        case 1:
            {
                system("cls");
                p.datenErfassen();
                system("pause");
                system("cls");
                break;
            }
        case 2:
            {
                system("cls");
                if(a.get_hat_buch() == true)
                {
                    cout << "Ausleihe nicht moeglich. Person hat bereits ein Buch ausgeliehen" << endl;
                }
                else
                {
                    cout << "Welches Buch soll ausgeliehen werden?" << endl;
                    for(int i=0;i<3;i++)
                    {
                        cout << "[" << i+1 << "] ";
                        b[i].datenAusgeben();
                        cout << endl;
                    }
                    cout << endl << "Auswahl: ";
                    cin >> auswahl;

                    system("cls");
                    cout << "Bis wann soll das Buch zurueckgegeben werden?" << endl;
                    d.datumErfassen();

                    a.datenErfassen(p,b[auswahl-1],d);
                }

                system("pause");
                system("cls");
                break;
            }
        case 3:
            {
                system("cls");
                if(a.get_hat_buch() == true)
                    a.verlaengere();
                else
                    cout << "Person hat kein Buch ausgeliehen." << endl;
                system("pause");
                system("cls");
                break;
            }
        case 4:
            {
                system("cls");
                if(a.get_hat_buch() == true)
                    a.datenAusgeben();
                else
                    cout << "Person hat kein Buch ausgeliehen." << endl;
                system("pause");
                system("cls");
                break;
            }
        case 5:
            {
                system("cls");
                if(a.get_hat_buch() == true)
                    a.zurueckgeben();
                else
                    cout << "Person hat kein Buch ausgeliehen." << endl;
                system("pause");
                system("cls");
                break;
            }
        case 0:
            {
                cout << endl << "Auf Wiedersehen" << endl;
                return 0;
            }
        default:
            {
                cout << endl << "Falsche Eingabe!" << endl;
                system("pause");
            }
        }
    }while(auswahl!=0);

    return 0;
}
