#include <iostream>         // cin, cout, fixed
#include <fstream>          // fájlkezelés
#include <vector>           // vector adattípus
#include <set>              // halmaz adattípus
#include <algorithm>        // max_element
#include <iomanip>          // setprecision
#include <cstring>          // to_string

using namespace std;

struct jarmu
{
    string rendszam;
    int ora, perc, sebesseg;
};

void F1(vector<jarmu> &j)
{
    ifstream fbe;
    fbe.open("jeladas.txt");
    jarmu temp;
    while(fbe >> temp.rendszam >> temp.ora >> temp.perc >> temp.sebesseg)
    {
        j.push_back(temp);
    }
    fbe.close();
}

// ----------------------------------------------------------------------------------------------
// 2. Állapítsa meg, hogy milyen időpontban történt a legutolsó jeladás, és írja a képernyőre
//    az időpontot, valamint az utoljára jelet adó autó rendszámát!
// ----------------------------------------------------------------------------------------------
void F2(vector<jarmu> j)
{
    cout << "2. feladat:" << endl;
    auto utolso = j[j.size()-1];
    cout << "Az utolsó jeladás időpontja " << utolso.ora << ":" << utolso.perc << ", a jármű rendszáma " << utolso.rendszam << endl;
}

// ----------------------------------------------------------------------------------------------
// 3. Írja ki a bemeneti állományban elsőként szereplő jármű rendszámát, valamint azt, hogy
//    milyen időpontokban adott jelzést! Az időpontokat óra:perc formátumban, szóközzel
//    elválasztva, egy sorban jelenítse meg!
// ----------------------------------------------------------------------------------------------
void F3(vector<jarmu> j)
{
    cout << "3. feladat:" << endl;
    jarmu elso = j[0];
    cout << "Az első jármű: " << elso.rendszam << endl;                             // TLJ-509
    cout << "Jeladásainak időpontjai: ";
    for(jarmu Jarmu:j)
    {
        if(Jarmu.rendszam == elso.rendszam)
            cout << Jarmu.ora << ":" << Jarmu.perc << " ";              // 6:4 6:14 6:30 6:32 6:51 6:54 7:7 7:19 7:30 7:31
    }
    cout << endl;
}

// ----------------------------------------------------------------------------------------------
// 4. Kérje be a felhasználótól egy időpont óra és perc értékét, és adja meg, hogy hány jeladás
//    történt az adott időpontban! Ha nem történt jeladás, akkor 0-t írjon ki!
// ----------------------------------------------------------------------------------------------
void F4(vector<jarmu> j)
{
    cout << "4. feladat:" << endl;
    int ora, perc, jeladasok_szama = 0;
    cout << "Kérem, adja meg az órát: ";                        // 6
    cin  >> ora;
    cout << "Kérem, adja meg a percet: ";                       // 54
    cin  >> perc;
    for(jarmu Jarmu:j)
    {
        if(Jarmu.ora == ora && Jarmu.perc == perc) jeladasok_szama++;
    }
    cout << "A jeladások száma: " << jeladasok_szama << endl;   // 3
}

// ----------------------------------------------------------------------------------------------
// 5. Állapítsa meg, hogy mennyi az adatok szerint a legnagyobb sebesség, amellyel egy jármű
//    a jeladáskor haladt, illetve adja meg az összes autó rendszámát, ami haladt ilyen
//    sebességgel! Amennyiben egy jármű többször is haladt a legnagyobb sebességgel, akkor a
//    rendszámát többször is megjelenítheti. A rendszámokat egy sorban, szóközzel elválasztva
//    jelenítse meg a minta szerint!
// ----------------------------------------------------------------------------------------------
bool sebesseg(jarmu a, jarmu b)
{
    return a.sebesseg < b.sebesseg;
}

void F5(vector<jarmu> j)
{
    cout << "5. feladat:" << endl;
    // jarmu max_sebesseges_jarmu = *max_element(j.begin(), j.end(), sebesseg);
    // int max_sebesseg = max_sebesseges_jarmu.sebesseg;
    int max_sebesseg = 0;
    for(jarmu Jarmu:j)
    {
        if(Jarmu.sebesseg > max_sebesseg) max_sebesseg = Jarmu.sebesseg;
    }
    cout << "A legnagyobb sebesség km/h: " << max_sebesseg << endl;             // 154
    cout << "A járművek: ";
    for (jarmu Jarmu:j)
    {
        if(Jarmu.sebesseg == max_sebesseg) cout << Jarmu.rendszam << " ";
    }
}

// ----------------------------------------------------------------------------------------------
// 6. Kérje be a felhasználótól egy jármű rendszámát, és jelenítse meg a jármű jeladásainak
//    időpontját és az adott rendszámú autó távolságát az útszakasz kezdetétől! A bevezető
//    példában az első jármű esetén a 6:04-kor a jármű távolsága az útszakasz kezdetétől 0,0 km,
//    míg 6:14-kor 15,8 km, mivel a jármű az eltelt 10 perc (10/60 óra) alatt 95 km/h-val haladt.
//    A kimenetet a mintának megfelelőn alakítsa ki, a távolságot minden esetben egy
//    tizedesjegyre kerekítve írja ki km mértékegységben! Ha nem szerepel a bekért rendszámmal
//    jármű, akkor azt egy rövid mondatban jelezze a felhasználónak!
// ----------------------------------------------------------------------------------------------
float eltelt_ido(int elozo[3], jarmu ja)
{
    return (ja.ora * 60 + ja.perc) - (elozo[0] * 60 + elozo[1]);
}

void F6(vector<jarmu> j)
{
    cout << "6. feladat:" << endl;
    string rendszam;
    float ido;
    int elozo_jeladas[3] = {0, 0, 0};
    float tavolsag;
    cout << "Kérem, adja meg a rendszámot: ";          // ZVJ-638
    cin >> rendszam;
    bool elso = true;
    for(jarmu Jarmu:j)
    {
        if(Jarmu.rendszam == rendszam)
        {
            if(!elso)
            {
                ido = eltelt_ido(elozo_jeladas, Jarmu);
                tavolsag += elozo_jeladas[2] * (ido / 60);                      // s = v * t (fizika)
            }
            else
            {
                tavolsag = 0.0;
                elso = false;
            }
            elozo_jeladas[0] = Jarmu.ora;
            elozo_jeladas[1] = Jarmu.perc;
            elozo_jeladas[2] = Jarmu.sebesseg;
            cout << fixed;
            cout << Jarmu.ora << ":" << Jarmu.perc << " " << setprecision(1) << tavolsag << " km" << endl;
        }
    }
    if(elso) cout << "Nincs ilyen rendszám!" << endl;
}

// ----------------------------------------------------------------------------------------------
// 7. Készítsen egy ido.txt szöveges állományt, amelynek mindegyik sorában egy-egy jármű
// rendszáma, illetve első és utolsó jeladásának óra és perc értéke szerepeljen!
// Az állományban minden jármű pontosan egyszer forduljon elő tetszőleges sorrendben!
// ----------------------------------------------------------------------------------------------
void F7(vector<jarmu> j)
{
    ofstream fki;
    fki.open("ido.txt");
    set<string> rendszamok;
    bool elso;
    string sor, vege;
    for(jarmu Jarmu:j)
    {
        rendszamok.insert(Jarmu.rendszam);
    }
    for(string rendszam:rendszamok)
    {
        elso = true;
        for(jarmu Jarmu:j)
        {
            if(Jarmu.rendszam == rendszam)
            {
                if(elso)
                {
                    sor = rendszam + " " + to_string(Jarmu.ora) + " " + to_string(Jarmu.perc);
                    elso = false;
                }
                else
                {
                    vege = " " + to_string(Jarmu.ora) + " " + to_string(Jarmu.perc);
                }
            }
        }
        sor += vege;
        fki << sor << endl;
    }
    fki.close();
}

int main()
{

    setlocale(LC_ALL,"");

    vector<jarmu> jarmuvek;
    F1(jarmuvek);
    F2(jarmuvek);
    F3(jarmuvek);
    F4(jarmuvek);
    F5(jarmuvek);
    F6(jarmuvek);
    F7(jarmuvek);

    return 0;
}
