#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 Szemely {
    string nev, tel, cim;
};

struct Telefonkonyv {
    vector<Szemely> szemelyek;
};

void uj_szemely_hozzaad(Telefonkonyv& telefonkonyv, Szemely szemely) {
    telefonkonyv.szemelyek.push_back(szemely);
}

int keres(Telefonkonyv telefonkonyv, string nev) {
    for (unsigned i = 0; i < telefonkonyv.szemelyek.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 (telefonkonyv.szemelyek[i].nev == nev)
            return i;
    return telefonkonyv.szemelyek.size();
}

void szemely_torol(Telefonkonyv& telefonkonyv, string nev) {
    for (unsigned i = 0; i < telefonkonyv.szemelyek.size(); i++)
        if (telefonkonyv.szemelyek[i].nev == nev) {
            telefonkonyv.szemelyek[i] = telefonkonyv.szemelyek.back(); // a back() függvény az utolsó elem adja vissza a vector-ból
            telefonkonyv.szemelyek.pop_back(); // törlöm az utolsó elemet
        }
}

// 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, Telefonkonyv& telefonkonyv) {
    stringstream ss;
    string nev, tel, cim;
    ss << sor;
    Szemely temp;
    getline(ss, temp.nev, ',');
    getline(ss, temp.tel, ',');
    getline(ss, temp.cim);
    uj_szemely_hozzaad(telefonkonyv, temp);
}
Telefonkonyv betolt(string fname) {
    ifstream f(fname);
    if (f.fail()) // Erősen javasolt erről a vizsgálatról SOHA el nem feledkezni...
        cerr << "A fajl megnyitasa sikertelen!\n";
    Telefonkonyv 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;
}

/// Idaig


int main() {

    srand(time(0));
    int feladat = 0;

    Telefonkonyv T;
    Szemely szemely;
    szemely.nev = "Bator Bela";
    szemely.tel = "06705571567";
    szemely.cim = "1096 Bp. Ulloi ut 154.";
    uj_szemely_hozzaad( T, szemely );
    ellenoriz( T.szemelyek.size() == 1 && T.szemelyek[0].cim.compare( "1096 Bp. Ulloi ut 154." ) == 0 );


    Szemely szemely2;
    szemely2.nev = "Gyuros Gyuri";
    szemely2.tel = "06704568887";
    szemely2.cim = "1096 Bp. Vendel utca 15.";
    uj_szemely_hozzaad( T, szemely2 );
    Szemely szemely3;
    szemely3.nev = "Sukar Sandor";
    szemely3.tel = "06302228839";
    szemely3.cim = "1164 Bp. Janos utca 210.";
    uj_szemely_hozzaad( T, szemely3 );
    ellenoriz( keres( T, "Gyuros Gyuri") == 1 && keres( T, "Eros Istvan") == (int)T.szemelyek.size() && keres( T, "Sukar Sandor") == 2 );


    size_t eredeti_meret = T.szemelyek.size();
    szemely_torol( T, "Sukar Sandor" );
    ellenoriz( keres( T, "Sukar Sandor") == (int)T.szemelyek.size() && T.szemelyek.size() == eredeti_meret-1 );


    string fnev = "telefonkonyv.txt";
    ofstream kiir( fnev.c_str() );
    size_t szemelyekSzama = 10;
    for( size_t i=0; i<szemelyekSzama; ++i )
    {
        kiir << "Szemely" << i << ',' << "0670" << rand()%8999+1000 << rand()%8999+1000 << ',' << "Lakhely" << i << endl;
    }
    kiir.close();

    Telefonkonyv T2;
    T2 = betolt( fnev );
    ellenoriz( T2.szemelyek.size() == szemelyekSzama && T2.szemelyek[szemelyekSzama-1].nev == "Szemely9" && T2.szemelyek[szemelyekSzama-1].cim == "Lakhely9" );

    cout << "\n" << feladat << "/4 feladat" <<endl;
    if( feladat == 4 ) cout << "Hivj egy felugyelot, hogy lepontozzon!" <<endl;
    return 0;

}
