#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <vector>
#include <sstream>
using namespace std;

#define ellenoriz(x) if (x) feladat++; else cout << "a feltetel nem teljesult a " << __LINE__ << ". sorban" << endl

/** Szabályok:
    - kódolni az ///Innetol ///Idáig részen lehet
    - csak az a beugró érvényes, amely nem tartalmaz semmilyen kód változtatást a main()-ben és csökkent függvényben
      valamint már nincs benne kikommentezve semmi
    - az eredeti main() egészében nem kikommentezhetõ!
    - az "ellenoriz"-en kívül nem tartalmaz #define sorokat, és azt sem szabad megváltoztatni
    - új #include hozzáadása megengedett a C/C++ standard könyvtárbeli elemek közül
*/


/// Innentol

struct Foglalas {
    string nev;
    int ejszakak_szama;
};

struct Hotel {
    string nev;
    int szobak_szama;
    int szoba_ar_egy_ejszakara;
    vector<Foglalas> foglalasok;
};

Hotel uj_hotel(string nev, int ferohely, int szoba_ar) {
    return {nev,ferohely,szoba_ar,vector<Foglalas>()};
}

void szoba_foglalas(Hotel& h, string nev, int ejszakak) {
    if (h.foglalasok.size() < h.szobak_szama)
        h.foglalasok.push_back({nev, ejszakak});
}

int bevetel(Hotel h) {
    int szamlalo = 0;
    for (Foglalas f : h.foglalasok)
        szamlalo += f.ejszakak_szama;
    return szamlalo*h.szoba_ar_egy_ejszakara;
}

void valtozasok_beolvasasa(Hotel& h) {
    ifstream f(h.nev + ".txt");
    if (f.fail())
        return;
    string sor;
    while(getline(f, sor)) {
        stringstream ss(sor);
        string datum, parancs, adat;
        getline(ss, datum, '-');
        getline(ss, parancs, ':');
        getline(ss, adat);
        if (parancs == "Uj nev")
            h.nev = adat;
        else if (parancs == "Uj szobak")
            h.szobak_szama += atoi(adat.c_str());
        else if (parancs == "Szobak uj ara")
            h.szoba_ar_egy_ejszakara = atoi(adat.c_str());
    }
}

/// Idaig



int csokkent(int& mit_csokkent) {
    int randomszam = rand() % 3 + 1;
    mit_csokkent -= randomszam;
    return randomszam;
}

int main()
{
    int feladat = 0;
    srand(time(0));

    Hotel h1 = uj_hotel("Musica Hotel", 5, 200);
    ellenoriz(h1.nev == "Musica Hotel" && h1.szobak_szama == 5 && h1.szoba_ar_egy_ejszakara == 200);

    szoba_foglalas(h1, "Jacob van Eyck", 2);
    szoba_foglalas(h1, "Antonio Vivaldi", 1);
    szoba_foglalas(h1, "Philip Emmanuel Bach", 1);
    szoba_foglalas(h1, "Frederic Chopin", 2);
    szoba_foglalas(h1, "Richard Wagner", 3);
    szoba_foglalas(h1, "Mr. Bean", 2);              // Elfogytak a szobák, ezt a foglalást nem lehet teljesíteni...
    ellenoriz(h1.foglalasok[0].nev == "Jacob van Eyck" && h1.foglalasok[4].ejszakak_szama == 3 && h1.foglalasok.size() == 5);

    Hotel h2 = uj_hotel("Science Hotel", 10, 100);
    int randomszam = 24 + rand() % 7;
    int randomszam2 = randomszam * 100;
    szoba_foglalas(h2, "Thales", csokkent(randomszam));
    szoba_foglalas(h2, "Euclides", csokkent(randomszam));
    szoba_foglalas(h2, "Galileo Galilei", csokkent(randomszam));
    szoba_foglalas(h2, "Leonardo da Vinci", csokkent(randomszam));
    szoba_foglalas(h2, "Isaac Newton", csokkent(randomszam));
    szoba_foglalas(h2, "Charles Darwin", csokkent(randomszam));
    szoba_foglalas(h2, "Louis Pasteur", csokkent(randomszam));
    szoba_foglalas(h2, "Szent-Gyorgyi Albert", randomszam);
    ellenoriz(bevetel(h1) == 1800 && bevetel(h2) == randomszam2);

    randomszam = rand() % 10;
    randomszam2 = rand() % 50 + 50;
    ofstream f("Musica Hotel.txt");
    f << "2017.10.12-Uj nev:Musica Hotel and Wellness" << endl
      << "2017.08.23-Uj szobak:" << randomszam << endl                // Épület bővítés
      << "2017.08.23-Szobak uj ara:" << randomszam2 + 200 << endl
      << "2017.06.01-Uj szobak:" << randomszam << endl;
    f.close();
    f.open("Science Hotel.txt");
    f << "2018.01.12-Uj szobak:" << randomszam2 / 10 << endl
      << "2018.01.01-Szobak uj ara:" << randomszam * 10 + 100 << endl;
    f.close();
    valtozasok_beolvasasa(h1);                      // A hotel nevének megfelelő fájlból
    valtozasok_beolvasasa(h2);
    ellenoriz(h1.nev == "Musica Hotel and Wellness" && h1.szobak_szama == 5+randomszam*2 && h1.szoba_ar_egy_ejszakara == randomszam2+200);
    ellenoriz(h2.szobak_szama == 10+randomszam2/10 && h2.szoba_ar_egy_ejszakara == randomszam*10+100);

    cout << "\n" << feladat << "/5 feladat" <<endl;
    if( feladat == 5 ) cout << "Hivj egy felugyelot, hogy lepontozzon!" <<endl;
    return 0;

}
