#include <iostream>             // cin, cout
#include <fstream>              // fájlkezelés
#include <vector>               // vector adattípushoz
#include <set>                  // set (halmaz) adattípushoz
#include <cstdlib>              // atoi (integerré konvertál stringeket

using namespace std;

class sorozat
{
public:
    string d;   // dátum - pl.: 2017.07.16
    string c;   // sorozat címe - pl.: Games
    string e;   // évad és epizód - pl.: 7x01
    int h;      // epizódok hossza - pl.: 60
    int m;      // megnézte már vagy nem - pl.: 1 (vagy 0)
};

// Ez igazából nem kellene, csak gyakorljuk vele a class használatát
// Lehetne az adatok kezelése egy egyszerű struktúrával és mátrix segítségével
// Most vectorral dolgozunk, aminek vectorok az elemei és azok egy osztály objektumai
// Ez a modul (convert_class) a szövegesen kezelt forrásadatokat alakítja a class-ban megadott típusokra
// Később ez egyszerűsíti a dolgokat, de most túl bonyolultnak látszik... :)
void convert_class(vector<sorozat> &s, vector<vector<string>> ts)
{
    sorozat temp;
    for(int i=0;i<ts.size();i++)
    {
        for(int j=0;j<ts[i].size();j++)
        {
            switch(j)
            {
                case 0:
                    temp.d=ts[i][j];                    // dátum, ami szöveges marad
                    break;
                case 1:
                    temp.c=ts[i][j];                    // cím, ami szöveges marad
                    break;
                case 2:
                    temp.e=ts[i][j];                    // évadXepizód, ami szöveges marad
                case 3:
                    temp.h=atoi(ts[i][j].c_str());      // epizód hossza, ami integer lesz
                    break;
                case 4:
                    temp.m=atoi(ts[i][j].c_str());      // megnézte vagy nem, ami integer lesz
                    break;
            }

        }
        s.push_back(temp);
    }
}
// s - sorozat objektumok vektora, ts - szöveges vektorok vektora <--- ebbe olvassuk a fájlt
// majd konvertáljuk sorozat objektumok vektorává
void F1(vector<sorozat> &s, vector<vector<string>> &ts)
{
    ifstream fbe;
    fbe.open("lista.txt");
    string sor;
    vector<string> temp;            // Ebbe kerül 5 sor a fájlból (ezek az összetartozó adatok)
    int i=1;                        // i segytségével számoljuk a sorokat
    while(getline(fbe,sor))         // A címek miatt kell a getline, mert azokban lehet szóköz is
    {
        temp.push_back(sor);        // beolvasott sor megy az átmenti vektorba
        if(i==5)                    // ha megvan az 5 sor, akkor...
        {
            ts.push_back(temp);     // megy a ts-be
            temp.clear();           // átmeneti listát "ürítjük" a következő 5 sor számára
            i=0;
        }
        i++;
    }
    fbe.close();
    convert_class(s,ts);            // ts ---> s
}

void F2(vector<sorozat> s)
{
    cout << "2. feladat" << endl;
    int db=0;
    for(auto elem:s)
    {
        if(elem.d!="NI") db++;          // dátum "mező"
    }
    printf("A listában %d db vetítési dátummal rendelkező epizód van.\n", db);
}

void F3(vector<sorozat> s)
{
    cout << endl << "3. feladat" << endl;
    int db=0;
    for(auto elem:s)
    {
        if(elem.m==1) db++;             // megnézte-e "mező"
    }
    float arany=(float) db/(float) s.size()*100;
    printf("A listában lévő epizódok %.2f%s-át látta.\n",arany,"%");
}

void F4(vector<sorozat> s)
{
    cout << endl << "4. feladat" << endl;
    int szumma=0;
    for(auto elem:s)
    {
        if(elem.m==1) szumma+=elem.h;   // ha megnézte, akkor összesítjük az epizódok hosszát
    }
    int nap=szumma/(24*60);
    int ora=szumma%(24*60)/60;
    int perc=szumma%(24*60)%60;
    printf("Sorozatnézéssel %d napot %d órát és %d percet töltött.\n",nap,ora,perc);
}

void F5(vector<sorozat> s)
{
    cout << endl << "5. feladat" << endl;
    string datum;
    cout << "Adjon meg egy dátumot! Dátum= ";
    cin >> datum;
    for(auto elem:s)
    {
        if(elem.d<=datum&&elem.m==0)        // ha dátum jó és még nem nézte meg, akkor...
        {
            cout << elem.e << "\t" << elem.c << endl;       //... kiírjuk!
        }
    }
}

string hetnapja(int ev, int ho, int nap)
{
    string napok[7]={"v", "h", "k", "sze", "cs", "p", "szo"};
    int honapok[12]={0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    if(ho<3)
    {
        ev--;
    }
    int index=(ev + ev/4 - ev/100 + ev/400 + honapok[ho-1] + nap) % 7;
    return napok[index];
}

void F7(vector<sorozat> s)
{
    cout << endl << "7. feladat" << endl;
    cout << "Adja meg a hét egy napját (például cs)! Nap= ";
    string day;
    cin >> day;
    int e,h,n;
    set<string> filmcim;            // halmazt használunk, így az ismétlődő filmcímekből csak egy lesz

    for(auto elem:s)
    {
        if(elem.d!="NI")            // ismert a vetítés dátuma
        {
            e=atoi(elem.d.substr(0,4).c_str());     // dátum "mező" elemekre bontása és egészre konvertálása
            h=atoi(elem.d.substr(5,2).c_str());
            n=atoi(elem.d.substr(8,2).c_str());
            if(hetnapja(e,h,n)==day)
            {
                filmcim.insert(elem.c);             // címek halmazba helyezése
            }
        }

    }
    if(filmcim.size()==0)
        cout << "Az adott napon nem kerül adásba sorozat." << endl;
    else
        for(auto cim:filmcim) cout << cim << endl;
}

void F8(vector<sorozat> s)
{
    cout << endl << "8. feladat" << endl;
    ofstream fki;
    fki.open("summa.txt");
    string akt_cim=s[0].c;                          // az első filmcím kiemelése
    int epizodok_szama=0, hossz;                    // összesítéshez, számolásokhoz
    for(auto elem:s)                                // minden elemet vizsgálunk a vektorban
    {
        if(elem.c==akt_cim)                         // ha cím azonos a kiemelttel, akkor...
        {
            epizodok_szama++;                       // számláló növelése
            hossz=elem.h;                           // adott sorozat epizódjainak a hossza
        }
        else
        {
            fki << akt_cim << " " << epizodok_szama*hossz << " " << epizodok_szama << endl;     // másik cím jön...
            akt_cim=elem.c;                         // ez lesz az új kiemelt
            hossz=elem.h;                           // ez a hossza
            epizodok_szama=1;                       // és egy epizod már van is belőle
        }
    }
    fki.close();
}

int main()
{
    setlocale(LC_ALL,"");
    vector<sorozat> sorozatok;
    vector<vector<string>> temp_sorozatok;
    F1(sorozatok,temp_sorozatok);
    F2(sorozatok);
    F3(sorozatok);
    F4(sorozatok);
    F5(sorozatok);
    F7(sorozatok);
    F8(sorozatok);

    return 0;
}
