#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <vector>
#include <fstream>
#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 már nincs benne kommentezve 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
    - ha szükségesnek érzed a standard C++ könyvtárból adhatsz hozzá #include-okat
*/

/// Innentol
struct Auto {
    string marka, rendszam;
    int loero;
};

struct Flotta {
    vector<Auto> jarmuvek;
};

void auto_vasarlasa(string marka, string rendszam, int loero, Flotta& flotta) {
    flotta.jarmuvek.push_back({marka, rendszam, loero});
    // Alternatív megoldás:
    /*Auto temp;
    temp.marka = marka;
    temp.rendszam = rendszam;
    temp.loero = loero;
    flotta.jarmuvek.push_back(temp);*/
}

int kivalaszt(string rendszam, Flotta flotta) {
    for (unsigned i = 0; i < flotta.jarmuvek.size(); i++) // Azért használok unsigned-et mert a size() függvény visszatérési típusa is előjel nélküli, és előjeles és előjel nélküli számok összehasonlítása veszélyes nagy számok esetén (ilyen kis példakódok esetén nincs jelentőssége, de jó szokás)
        if (flotta.jarmuvek[i].rendszam == rendszam)
            return i;
    return flotta.jarmuvek.size();
}

void auto_eladasa(string rendszam, Flotta& flotta) {
    for (unsigned i = 0; i < flotta.jarmuvek.size(); i++)
        if (flotta.jarmuvek[i].rendszam == rendszam) {
            flotta.jarmuvek[i] = flotta.jarmuvek.back(); // a back() függvény az utolsó elem adja vissza a vector-ból
            flotta.jarmuvek.pop_back(); // törlöm az utolsó elemet
        }
}

// Ez a beolvasás kicsit túl van bonyolítva, de mégis érdemes ezt a logikát követni (különszedni a sorok beolvasását
// a sorok feldarabolásától) minden fájl beolvasáskor, mert így viszonylag nehéz hibázni, és ha hibázol is,
// akkor is könnyű a hibát megtalálni.
/*void sor_darabolo(string sor, Flotta& flotta) {
    stringstream ss;
    string marka, rendszam, szam;
    ss << sor;
    getline(ss, marka, ';');
    getline(ss, rendszam, ';');
    getline(ss, szam);
    auto_vasarlasa(marka, rendszam, atoi(szam.c_str()), flotta);
}
Flotta betolt(string fname) {
    ifstream f(fname);
    if (f.bad()) // Erősen javasolt erről a vizsgálatról SOHA el nem feledkezni...
        cerr << "A fajl megnyitasa sikertelen!\n";
    Flotta eredmeny;
    string sor;
    while (getline(f, sor) and sor != "") // A getline beolvas egy sort, és egy logikai értékkel tér vissza, hogy sikerült-e a sor beolvasása. A feltétel második fele (sor != "") már az újonnan beolvasott soron dolgozik.
        sor_darabolo(sor, eredmeny);
    return eredmeny;
}*/

// Ha nem akarsz stringstream-et használni, akkor egy egyszerűbb (de könnyebben elrontható megoldás):
Flotta betolt(string fname) {
    ifstream f(fname);
    if (f.bad()) // Erősen javasolt erről a vizsgálatról SOHA el nem feledkezni...
        cerr << "A fajl megnyitasa sikertelen!\n";
    Flotta eredmeny;
    string sor;
    while (f.good()) {
        string marka, rendszam, szam;
        getline(f, marka, ';');
        getline(f, rendszam, ';');
        getline(f, szam);
        if (rendszam != "")
            auto_vasarlasa(marka, rendszam, atoi(szam.c_str()), eredmeny);
    }
    return eredmeny;
}

/// Idaig


int main() {

    srand(time(0));
    int feladat = 0;

    Auto jarmu1;
    jarmu1.marka = "Trabant";
    jarmu1.rendszam = "ABC-123";
    jarmu1.loero = 22;
    ellenoriz( jarmu1.rendszam.size() == 7 && jarmu1.marka.compare( "Trabant" ) == 0 );


    Flotta cegautok;
    auto_vasarlasa( "Skoda", "SZT-937", 91, cegautok );
    auto_vasarlasa( "Fiat", "FTT-673", 64, cegautok );
    auto_vasarlasa( "Porche", "PRS-115", 120, cegautok );
    ellenoriz( cegautok.jarmuvek.size() == 3 && cegautok.jarmuvek[1].rendszam[3] == '-' && cegautok.jarmuvek[2].marka.size() == 6 );


    ellenoriz( kivalaszt( "SZT-937", cegautok ) == 0 && kivalaszt( "ABC-123", cegautok ) == (int)cegautok.jarmuvek.size() && kivalaszt( "PRS-115", cegautok ) == 2 );


    string fajl_nev = "autok.txt";
    Flotta autok;
    autok = betolt( fajl_nev );
    ellenoriz( autok.jarmuvek.size() == cegautok.jarmuvek.size()*2+2 && autok.jarmuvek[autok.jarmuvek.size()-1].marka == "Renault" && autok.jarmuvek[autok.jarmuvek.size()-3].loero == 99 );


    size_t autok_szama = cegautok.jarmuvek.size();
    auto_eladasa( "FTT-673", cegautok );
    ellenoriz( kivalaszt( "FTT-673", cegautok) == (int)cegautok.jarmuvek.size() && cegautok.jarmuvek.size()+1 == autok_szama );


    cout << "\n" << feladat << "/5 feladat" <<endl;
    if( feladat == 5 ) cout << "Hivj egy felugyelot, hogy lepontozzon!" <<endl;
    return 0;

}
