#include <iostream>         // cin cout
#include <fstream>          // fájlkezelés
#include <sstream>          // stringstream F1 string darabolás
#include <vector>           // vector adattípusokhoz
#include <string>           // stringekhez stoi
#include <iomanip>          // setprecision F4
#include <cmath>            // round F5

using namespace std;

// string szavakra "hasogatása" egy vectorba
vector<string> split(string sor)
{
    stringstream line(sor);         // ez olyasmi, mint az (i/o)fstream, ahol a sor a fájltartalom
    vector<string> split_sor;
    string temp;
    while(line>>temp)
    {
        split_sor.push_back(temp);
    }
    return split_sor;
}

void F1(string f, vector<vector<string>> &m)
{
    ifstream fbe;
    string sor;
    fbe.open(f);
    while(getline(fbe,sor))
        m.push_back(split(sor));
    /*
    for(x:m)
    {
        for(y:x)
        {
            cout << y << " ";
        }
        cout << endl;
    }
    */
    fbe.close();
}

int F2(vector<vector<string>> m)
{
    return m.size();
}

int F3(vector<vector<string>> m)
{
    int db=0;
    for(auto meres:m)
    {
        if(stoi(meres[5])<9) db++;
    }
    return db;
}

long int valto(int o, int p, int mp, int emp)
    {
        return o*60*60*1000+p*60*1000+mp*1000+emp;
    }

void F4(vector<vector<string>> m)
{
    int db=0;
    cout << "4. feladat\nAdjon meg egy óra és perc értéket! ";
    string input_sor, temp;
    getline(cin,input_sor);
    stringstream input(input_sor);
    vector<int> oraperc;
    while(input>>temp)
    {
        oraperc.push_back(stoi(temp));
    }
    int ora=oraperc[0];
    int perc=oraperc[1];

    for(auto meres:m)
    {
        if(stoi(meres[1])==ora && stoi(meres[2])==perc)
        {
            db++;
        }
    }
    cout << "\ta. A kezdeti méréspontnál elhaladt járművek száma: " << db << endl;

    db=0;
    long int kezdo_ido=valto(ora,perc,0,0), kezd;
    long int vege_ido=valto(ora,perc,59,999), vege;

    for(auto meres:m)
    {
        kezd=valto(stoi(meres[1]),stoi(meres[2]),stoi(meres[3]),stoi(meres[4]));
        vege=valto(stoi(meres[5]),stoi(meres[6]),stoi(meres[7]),stoi(meres[8]));
        if(kezd<=vege_ido and vege>=kezdo_ido) db++;
    }
    cout << "\tb. A forgalomsűrűség: " << setprecision(4) << (float) db/10 << endl;
}

void F567(vector<vector<string>> m)
{
    float max_seb=0.0, seb, ido;
    int kezd, vege;
    int max_kezd, max_vege;
    float gyorshajto=0.0;
    string rendszam;

    // 7. feladat
    ofstream fki;
    fki.open("buntetes.txt");

    for(auto meres:m)
    {
        kezd=valto(stoi(meres[1]),stoi(meres[2]),stoi(meres[3]),stoi(meres[4]));
        vege=valto(stoi(meres[5]),stoi(meres[6]),stoi(meres[7]),stoi(meres[8]));
        ido=vege-kezd;
        seb=(10000/(ido/1000))*3.6;
        if(seb>max_seb)
        {
            max_seb=seb;
            max_kezd=kezd;
            max_vege=vege;
            rendszam=meres[0];
        }
        // 6. feladat
        if(seb>90.0) gyorshajto+=1.0;
        // 7. feladat
        if(seb>104.0 && seb<=121.0) fki << meres[0] << "\t" << (int) seb << " km/h\t30000 Ft" << endl;
        if(seb>121.0 && seb<=136.0) fki << meres[0] << "\t" << (int) seb << " km/h\t45000 Ft" << endl;
        if(seb>136.0 && seb<=151.0) fki << meres[0] << "\t" << (int) seb << " km/h\t60000 Ft" << endl;
        if(seb>151.0) fki << meres[0] << "\t" << (int) seb << " km/h\t200000 Ft" << endl;
    }

    // 7. feladat
    fki.close();

    int db=0;
    for(auto meres:m)
    {
        if(meres[0]!=rendszam)
        {
            kezd=valto(stoi(meres[1]),stoi(meres[2]),stoi(meres[3]),stoi(meres[4]));
            vege=valto(stoi(meres[5]),stoi(meres[6]),stoi(meres[7]),stoi(meres[8]));
            if(kezd<=max_kezd && vege>max_vege) db++;
        }
    }

    cout << "5. feladat\nA legnagyobb sebességgel haladó jármű" << endl;
    cout << "\trendszáma: " << rendszam << endl;
    cout << "\tátlagsebessége: " << round(max_seb) << " km/h" << endl;
    cout << "\táltal lehagyott járművek száma: " << db << endl;

    float gyh=(gyorshajto/m.size())*100.0;
    cout << "6. feladat\nA járművek " << setprecision(4) << gyh << "%-a volt gyorshajtó." << endl;
}

int main()
{
    setlocale(LC_ALL, "hun");
    vector<vector<string>> meresek;
    F1("meresek.txt", meresek);
    cout << "2. feladat\nA mérés során " << F2(meresek) << " jármű adatait rögzítették." << endl;
    cout << "3. feladat\n9 óra előtt " << F3(meresek) << " jármű haladt el a végponti mérőnél." << endl;
    F4(meresek);
    F567(meresek);
    return 0;
}
