#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 fo;
};

struct Etterem {
    string nev;
    int asztalok_szama;
    int etel_ar_egy_fore;
    vector<Foglalas> foglalasok;
};

Etterem uj_etterem_nyitas(string nev, int asztalok, int etel_ar) {
    return {nev,asztalok,etel_ar,vector<Foglalas>()};
}

void asztal_foglalas(string nev, int hany_fo, Etterem& e) {
    if (e.foglalasok.size() < e.asztalok_szama)
        e.foglalasok.push_back({nev, hany_fo});
}

int bevetel(Etterem e) {
    int szamlalo = 0;
    for (Foglalas f : e.foglalasok)
        szamlalo += f.fo;
    return szamlalo*e.etel_ar_egy_fore;
}

void atepites_beolvasasa(Etterem& e) {
    ifstream f(e.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")
            e.nev = adat;
        else if (parancs == "Uj asztalok")
            e.asztalok_szama += atoi(adat.c_str());
        else if (parancs == "Etelek uj ara")
            e.etel_ar_egy_fore = 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));

    Etterem e1 = uj_etterem_nyitas("Gundel", 6, 50);
    ellenoriz(e1.nev == "Gundel" && e1.asztalok_szama == 6 && e1.etel_ar_egy_fore == 50);

    asztal_foglalas("Petofi Sandor", 2, e1);
    asztal_foglalas("Arany Janos", 1, e1);
    asztal_foglalas("Ady Endre", 1, e1);
    asztal_foglalas("Mora Ferenc", 2, e1);
    asztal_foglalas("Babits Mihály", 3, e1);
    asztal_foglalas("Toth Arpad", 2, e1);
    asztal_foglalas("Anonymus", 4, e1);         // Elfogytak az asztalok, ezt a foglalást nem lehet teljesíteni...
    ellenoriz(e1.foglalasok[0].nev == "Petofi Sandor" && e1.foglalasok[4].fo == 3 && e1.foglalasok.size() == 6);

    Etterem e2 = uj_etterem_nyitas("Mandragora", 10, 100);
    int randomszam = 24 + rand() % 7;
    int randomszam2 = randomszam * 100;
    asztal_foglalas("George Washington", csokkent(randomszam), e2);
    asztal_foglalas("Thomas Jefferson", csokkent(randomszam), e2);
    asztal_foglalas("James Madison", csokkent(randomszam), e2);
    asztal_foglalas("Franklin Pierce", csokkent(randomszam), e2);
    asztal_foglalas("Abraham Lincoln", csokkent(randomszam), e2);
    asztal_foglalas("Theodore Roosevelt", csokkent(randomszam), e2);
    asztal_foglalas("Ronald Reagen", csokkent(randomszam), e2);
    asztal_foglalas("Barack Obama", randomszam, e2);
    ellenoriz(bevetel(e1) == 550 && bevetel(e2) == randomszam2);

    randomszam = rand() % 10;
    randomszam2 = rand() % 50 + 50;
    ofstream f("Gundel.txt");
    f << "2017.09.11-Uj nev:Gundel and Coffee" << endl
      << "2017.07.24-Uj asztalok:" << randomszam << endl                // Étterem bővítés
      << "2017.07.24-Etelek uj ara:" << randomszam2 + 50 << endl
      << "2017.05.03-Uj asztalok:" << randomszam << endl;
    f.close();
    f.open("Mandragora.txt");
    f << "2018.01.16-Uj asztalok:" << randomszam2 / 10 << endl
      << "2018.01.07-Etelek uj ara:" << randomszam * 10 + 100 << endl;
    f.close();
    atepites_beolvasasa(e1);                    // Az étterem nevének megfelelő fájlból
    atepites_beolvasasa(e2);
    ellenoriz(e1.nev == "Gundel and Coffee" && e1.asztalok_szama == 6+randomszam*2 && e1.etel_ar_egy_fore == randomszam2+50);
    ellenoriz(e2.asztalok_szama == 10+randomszam2/10 && e2.etel_ar_egy_fore == randomszam*10+100);

    cout << "\n" << feladat << "/5 feladat" <<endl;
    if( feladat == 5 ) cout << "Hivj egy felugyelot, hogy lepontozzon!" <<endl;
    return 0;

}
