#include <iostream>
#include <string.h>
#ifndef MEMTRACE
#include "memtrace.h"
#endif
#include <iostream>
#include <fstream>

#include "adatok.hpp"
#include "victor.h"
#include "element.h"
#include "string5.h"
#include "gtest_lite.h"

using std::cout;
using std::cin;
using std::endl;
using std::stringstream;


int main()
{
    //Generikus t�mb, amiben t�roljuk majd a l�ncolt list�nk
    victor<Adatok> adatok;

    TEST(TEST_01, Default konstruktor test){

        stringstream egy;

        adatok.addElement(Adatok(PublikusAdat(), PrivatAdat()));

        //adatok.kiir();
        adatok.testkiir(egy);

        EXPECT_STREQ("0 0 0 0 0\n", egy.str().c_str());

        adatok.deleteElement(0);
    }END

    TEST(TEST_02, Konstruktor teszteles){

        stringstream egy;

        adatok.addElement(Adatok(PublikusAdat("Kiss Bela", "06301111222"), PrivatAdat("beci", "Pest Virag 24", "06304444555")));

        adatok.testkiir(egy);

        EXPECT_STREQ("Kiss Bela 06301111222 beci Pest Virag 24 06304444555\n", egy.str().c_str());

        adatok.deleteElement(0);
    }END

    TEST(TEST_03, Egy elem feltoltese){

        stringstream egy;

        String nev = "Kiss Bela", munkaszam = "06301111222", becnev = "beci", lakcim = "Pest Virag 24", privatszam = "06304444555";
        adatok.addElement(Adatok(PublikusAdat(nev, munkaszam), PrivatAdat(becnev, lakcim, privatszam)));

        adatok.testkiir(egy);

        EXPECT_STREQ("Kiss Bela 06301111222 beci Pest Virag 24 06304444555\n", egy.str().c_str());
        adatok.deleteElement(0);
    }END

    TEST(TEST_04, Egy elem torlese){

        stringstream egy;

        adatok.addElement(Adatok(PublikusAdat("Kiss Bela", "06301111222"), PrivatAdat("beci", "Pest Virag 24", "06304444555")));
        adatok.addElement(Adatok(PublikusAdat("Nagy Tamas", "06307777888"), PrivatAdat("tomi", "Buda Kerekes 50", "06303333666")));

        adatok.deleteElement(0);

        adatok.testkiir(egy);

        EXPECT_STREQ("Nagy Tamas 06307777888 tomi Buda Kerekes 50 06303333666\n", egy.str().c_str());

        adatok.deleteElement(0);
    }END

    TEST(TEST_05, Ures elem torlese){

        stringstream egy;

        adatok.addElement(Adatok(PublikusAdat("Kiss Bela", "06301111222"), PrivatAdat("beci", "Pest Virag 24", "06304444555")));

        adatok.deleteElement(0);

        adatok.testkiir(egy);

        EXPECT_STREQ("Nincs adat, nem listazhatsz\n", egy.str().c_str());

    }END

    TEST(TEST_06, Listazas teszteles){

        stringstream egy;

        adatok.addElement(Adatok(PublikusAdat("Kiss Bela", "06301111222"), PrivatAdat("beci", "Pest Virag 24", "06304444555")));
        adatok.addElement(Adatok(PublikusAdat("Nagy Tamas", "06307777888"), PrivatAdat("tomi", "Buda Kerekes 50", "06303333666")));

        adatok.testkiir(egy);

        EXPECT_STREQ("Kiss Bela 06301111222 beci Pest Virag 24 06304444555\nNagy Tamas 06307777888 tomi Buda Kerekes 50 06303333666\n", egy.str().c_str());

    }END

    TEST(TEST_07, Ures lista teszteles){

        stringstream egy;

        adatok.deleteElement(1);
        adatok.deleteElement(0);

        adatok.testkiir(egy);

        EXPECT_STREQ("Nincs adat, nem listazhatsz\n", egy.str().c_str());

    }END

    TEST(TEST_08, Fajlba iras){

        stringstream egy;

        adatok.addElement(Adatok(PublikusAdat("Kiss Bela", "06301111222"), PrivatAdat("beci", "Pest Virag 24", "06304444555")));
        adatok.testfkiiras(egy);

        EXPECT_STREQ("A fajlba iras sikeres volt\n", egy.str().c_str());

        adatok.deleteElement(0);
    }END

    TEST(TEST_09, Fajlba iras ures){

        stringstream egy;

        adatok.testfkiiras(egy);

        EXPECT_STREQ("Nincs adat, igy nem irhatsz fajlba\n", egy.str().c_str());
    }END
    TEST(TEST_10, vCard kiiras){

        stringstream egy;

        adatok.addElement(Adatok(PublikusAdat("Kiss Bela", "06301111222"), PrivatAdat("beci", "Pest Virag 24", "06304444555")));

        adatok.testvCardkiiras(egy);

        EXPECT_STREQ("A vCard fajlbairas sikeres volt\n", egy.str().c_str());

        adatok.deleteElement(0);
    }END

    TEST(TEST_11, vCard ures kiiras){

        stringstream egy;

        adatok.testvCardkiiras(egy);

        EXPECT_STREQ("Nincs adat, nem tudsz vCardba irni\n", egy.str().c_str());
    }END

    cout<<endl;

    //Menu
    cout<< "+------------------------------------------+"<<endl;
    cout<< "|        Udv a telefonkonyvben :)))))))    |"<<endl;
    cout<< "|        1-es: szemely felvetel            |" <<endl;
    cout<< "|        2-as: szemelyek listazasa         |" <<endl;
    cout<< "|        3-es: szemely torlese             |" <<endl;
    cout<< "|        4-es: fajlba iras                 |" <<endl;
    cout<< "|        5-os: vCardba iras                |" <<endl;
    cout<< "|        6-os: kilepes                     |" <<endl;
    cout<< "+------------------------------------------+" << endl;
    cout<<endl;



    bool quit = false;
    int felvett = 0;
    int torolt = 0;

    //Ciklus ami addig fut, am�g ki nem akarunk l�pni
    while(!quit){

        String bejov;

        cout<< "Mit szeretnel?";
        cout<<endl;
        cin>>bejov;

        //Ha az 1-est v�lasztja bek�ri az adatokat a felhaszn�l�t�l
        if (!strcmp(bejov.c_str(), "1")){
            String aznev, munkaszam, becenevv, lakcim, privatszam;

            cout<< "Add meg a nevet szokozzel elvalasztva" << endl;
            String vezet, kereszt;
            cin>>vezet>>kereszt;
            aznev = vezet + " " + kereszt;

            cout<< "Add meg a munkaszamot" << endl;
            cin>>munkaszam;

            cout<< "Add meg a becenevet" << endl;
            cin>>becenevv;
            String telep, utca, hazszam;

            cout<< "Add meg a lakcimet(telepules, utca, hazszam)" << endl;
            cin>>telep>>utca>>hazszam;
            lakcim = telep + ";" + utca + " utca;" + ";" + hazszam;

            cout<< "Add meg a privatszamot" << endl;
            cin>>privatszam;

            //Felveszi a bevett adatokat
            adatok.addElement(Adatok(PublikusAdat(aznev, munkaszam), PrivatAdat(becenevv, lakcim, privatszam)));
            cout<< "A felvett szemely indexe " << felvett <<endl;
            felvett++;
        }

        //Ha kettest v�laszt kilist�zza a felvett adatokat, a t�r�lteket nem
        else if (!strcmp(bejov.c_str(), "2")){
            adatok.kiir();
        }

        //Kit�rli a megadott index� elemet
        else if (!strcmp(bejov.c_str(), "3")){
            int torol;
            cout<< "Kit szeretnel torolni? Add meg az indexet"<<endl;
            cin>>torol;
            //Ha nagyobb indexet ad meg, mint van,
            //vagy nem elfogadhat� �rt�ket, akkor nem lehet t�r�lni
            if (torol >= felvett || torol < 0){
                cout<< "Nincs ilyen adat nem torolhetsz"<<endl;
            }
            else {
                //Egy�bk�nt t�r�l
                adatok.deleteElement(torol-torolt);
                cout<< "Sikeres torles" <<endl;
                //cout<< "Az indexek egyel hatrebb csusztak! (pl.: az 1-es 0-as lett)" << endl;
                torolt++;
            }
        }
        //F�jlba�r�s
        else if (!strcmp(bejov.c_str(), "4")){
            adatok.fkiiras();
        }
        //vCardba �r�s
        else if (!strcmp(bejov.c_str(), "5")){
            adatok.vCardkiiras();
        }
        //Kil�p�s
        else if (!strcmp(bejov.c_str(), "6")){
            quit = true;
        }
        //Minden egy�b esetben ki kell l�pni, a Jporta miatt
        else {
            quit = true;
        }
    }
    return 0;
}