#include <iostream>
#include <fstream>
#include <sstream>      //stringstream miatt kell (lásd idoszoveg függvényt)

using namespace std;

struct hivas
{
    int h_kezd, h_vege;
}hivasok[1000];
//maximum 1000 sor lehet, és minden sorban 6 egész szám -> ezeket másodpercre váltjuk majd
int N;              //a fájlban lévő sorok száma (Figyeljünk az esetleges üres sorra a fájl végén!)

void kiir(string sz)
{
    cout << sz <<endl;
}

int mpbe(int ora, int perc, int mp)     //1. feladat
{
    int mp_x=ora*3600+perc*60+mp;
    return mp_x;
}

string idoszoveg(int mp)
{
    //A stringstream típus egy ún. string buffert használ, ami egy spec. memóriaterület
    //Ezt a memóriaterületet közvetlenül kezelhetjük, például az alábbiak szerint
    stringstream memoria;
    memoria << mp/3600 << " " << (mp%3600)/60 << " " << mp%60;
    string szoveges_ido;
    getline(memoria, szoveges_ido);
    return szoveges_ido;
}

void F2()
{
    ifstream fbe;
    int o, p, mp;
    fbe.open("hivas.txt");
    int i=0;
    cout << "Adatok beolvasása...";
    while(!fbe.eof())
    {
        fbe >> o >> p >> mp;
        hivasok[i].h_kezd=mpbe(o,p,mp);
        fbe >> o >> p >> mp;
        hivasok[i].h_vege=mpbe(o,p,mp);
        i++;
    }
    cout << "vége!" << endl;
    N=i-1;      //-1 az üres sor miatt a fájl végén
    cout << "Beolvasott sorok száma: " << N << endl;
    fbe.close();

}

void F3()       //MEGSZÁMLÁLÁS
{
    int orak[24]={0};   //Ebben számoljuk az órákhoz tartozó hívások számát, kezdetben mind nulla
    for(int i=0;i<N;i++)
    {
        orak[hivasok[i].h_kezd/3600]++;
    }
    for(int i=0;i<24;i++)
    {
        if(orak[i]>0) cout << i << " óra " << orak[i] << " hívás" << endl;
    }
}

void F4()       //MAXIMUMKERESÉS
{
    int maxhossz=0;
    int maxhely=0;

    for(int i=0;i<N;i++)
    {

        if(hivasok[i].h_vege-hivasok[i].h_kezd>maxhossz)
        {
            maxhossz=hivasok[i].h_vege-hivasok[i].h_kezd;
            maxhely=i+1;
        }
    }
    cout << "A leghosszabb ideig vonalban lévő hívó " << maxhely << ". sorban szerepel, ";
    cout << "a hívás hossza: " << maxhossz << " másodperc." << endl;
}

void F5()   //LINEÁRIS KERESÉS
{
    int ora, perc, mp;
    cout << "Kérek egy időpontot! (óra, perc, mp)" << endl;
    cout << "óra: "; cin >> ora;
    cout << "perc: "; cin >> perc;
    cout << "mp: "; cin >> mp;
    int most=mpbe(ora,perc,mp);
    int kezd, vege;
    int beszelo=0,varakozo=0;      //várakozók száma
    for(int i=0;i<N;i++)
    {
        if(hivasok[i].h_kezd<=most&&most<hivasok[i].h_vege&&beszelo!=0)
        //Ennek meg kell előznie a beszélő megállapítását, hogy a beszélőt ne számolja bele a várakozókba
        {
            varakozo++;
        }
        //Kihasználjuk, hogy az adatok hívásidő szerint sorban vannak
        if(hivasok[i].h_kezd<=most&&most<hivasok[i].h_vege&&beszelo==0)
        {
            beszelo=i+1;    //+1, mert nem indexet közlünk a felhasználóval, hanem tényleges sorszámot!
        }

    }
    if(beszelo==0)
        cout << "Nem volt beszélő!" << endl;
    else
        cout << "Várakozók száma: " << varakozo << ", a beszélő a(z) " << beszelo << ". hívó." << endl;
}

void F6()
{
    int kezd, vege, u_kezd, e_vege;
    int varakozas;      //várakozási idő
    int elozo,utolso=0;
    int ora12=mpbe(12,0,0);
    for(int i=0;i<N;i++)
    {
        if(hivasok[i].h_kezd<=ora12&&hivasok[i].h_vege>hivasok[utolso].h_vege)
        {
            elozo=utolso;
            utolso=i;
        }
    }
    varakozas=hivasok[elozo].h_vege-hivasok[utolso].h_kezd;
    cout << "Az utolsó telefonáló adatai a(z) " <<  utolso+1 << ". sorban vannak, ";
    cout << varakozas << " másodpercig várt." << endl;
}

void F7()
{
    cout << "Adatok kiírása a fájlba..." << endl;
    int munkakezdes=mpbe(8, 0, 0);
    int ora12=mpbe(12,0,0);
    ofstream fki;
    fki.open("sikeres2.txt");
    int vonalban=0;
    //Megkeressük az első olyan hívót, aki 8 óra után tette le a telefont,
    //az ilyenre azt mondjuk, hogy vonalban volt 8-kor, illetve utána
    while(hivasok[vonalban].h_vege<munkakezdes)
    {
        vonalban++;
    }
    //Az alábbi +1 a szokásos indexprobléma miatt van :)
    //Ha 8 előtt hívta a központot, a beszélgetése csak 8-tól kezdődhetett
    if(munkakezdes>hivasok[vonalban].h_kezd)
        fki << vonalban+1 << " " << idoszoveg(munkakezdes);
    else
        fki << vonalban+1 << " " << idoszoveg(hivasok[vonalban].h_kezd);
    fki << " " << idoszoveg(hivasok[vonalban].h_vege) << endl;

    //Az első vonalban lévő után a többi sikeres telefonálót is kiírjuk a fájlba
    for(int i=0; i<N; i++)
    {
        //Akkor sikeres hívó, ha az aktuálisan vonalban lévőhöz képest,
        //ő később tette le a kagylót és a kezdése mukaidő vége előtt volt
        if(hivasok[i].h_kezd<=ora12&&hivasok[i].h_vege>hivasok[vonalban].h_vege)
        {
            fki << i+1 << " " << idoszoveg(max(hivasok[i].h_kezd, hivasok[vonalban].h_vege)) << " ";
            fki << idoszoveg(hivasok[i].h_vege) << endl;

            vonalban=i; //Ha van egy ilyen (lásd pár sorral feljebb), akkor ő lesz az akihez majd nézzük a következőt
        }
    }
    fki.close();
}

int main()
{
    setlocale(LC_ALL, "hun");
    kiir("2. feladat:");
    F2();
    kiir("3. feladat:");
    F3();
    kiir("4. feladat:");
    F4();
    kiir("5. feladat:");
    F5();
    kiir("6. feladat:");
    F6();
    kiir("7. feladat:");
    F7();

    return 0;

}
