#include <iostream>         // cin és cout parancsok
#include <fstream>          // fájlkezelés
#include <vector>           // vector adattípushoz
#include <set>              // set (halmaz) adattípushoz
#include <algorithm>        // min és max függvények
#include <ctime>            // srand és rand függvények (véletlenszámok)

using namespace std;

struct igeny
{
    int o, p, mp, cs, be, ki;
};

int hely;       // 2. és 5. feladat
int cspszam;    // 6. és 7. feladat
int szintek;    // 4. feladat
int csapat;     // 7. feladat
set<int> nem;   // 7. feladat

void F1(vector<igeny> &igenyek)
{
    cout << "1. feladat - adatok beolvasása..." << endl;
    igeny temp;
    ifstream fbe;
    fbe.open("igeny.txt");
    int igenyszam;
    fbe >> szintek;
    fbe >> cspszam;
    fbe >> igenyszam;
    while(fbe>>temp.o&&fbe>>temp.p&&fbe>>temp.mp&&fbe>>temp.cs&&fbe>>temp.be&&fbe>>temp.ki)
    {
        igenyek.push_back(temp);
    }
    fbe.close();
    /*
    for(auto elem:igenyek)
        cout << elem.o << " " << elem.p << " " << elem.mp << " " << elem.cs << " " << elem.be << " " << elem.ki << endl;
    */
}

void F2()
{
    cout << "****************************************************************\n2. feladat" << endl;
    cout << "Kérem a lift indulási helyét! ";
    cin >> hely;
}

void F3(vector<igeny> igenyek)
{
    cout << "****************************************************************\n3. feladat" << endl;
    int utolso=igenyek[igenyek.size()-1].ki;
    printf("A lift a(z) %d. szinten áll az utolsó igény teljesítése után.\n", utolso);
}

void F4(vector<igeny> igenyek)
{
    cout << "****************************************************************\n4. feladat" << endl;
    int min_sz=szintek;
    int max_sz=0;
    for(auto elem:igenyek)
    {
        min_sz=min(min_sz,min(elem.be,elem.ki));
        max_sz=max(max_sz,max(elem.be,elem.ki));
    }
    printf("A legalacsonyabb szint: %d\n", min_sz);
    printf("A legmagasabb szint...: %d\n", max_sz);
}

void F5(vector<igeny> igenyek)
{
    cout << "****************************************************************\n5. feladat" << endl;
    int aktual=hely;                // ez az a hely, ahol a legelején áll a lift (lsd. 2. feladat)
    int ures=0, utas=0;             // megfelelő számlálók inicializálása
    for(auto elem:igenyek)          // végigmegyünk az igényeken...
    {
        if(elem.be<elem.ki) utas++;     // ha induló szint kisebb, akkor felfelé megy utassal
        if(elem.be>aktual) ures++;      // ha a lift alacsonyabb szinten van a híváskor, akkor üresen megy fel a szerelőkhöz
        aktual=elem.ki;                 // ahol kiszállnak az lesz az "új" altuális hely
    }
    printf("A lift %d alkalommal ment felfelé utasokkal.\n", utas);
    printf("A lift %d alkalommal ment felfelé utasok nélkül.\n", ures);
}

void F6(vector<igeny> igenyek)
{
    cout << "****************************************************************\n6. feladat" << endl;
    int csapatok[cspszam]={0};
    for(auto elem:igenyek)
    {
        csapatok[elem.cs-1]++;
    }
    for(int i=0;i<cspszam;i++)
    {
        if(csapatok[i]==0)
        {
            nem.insert(i+1);
            cout << i+1 << " ";
        }
    }
    cout << endl;
}

void F7(vector<igeny> igenyek)
{
    cout << "****************************************************************\n7. feladat" << endl;
    srand(time(NULL));
    do
    {
        csapat=rand()%cspszam+1;
    }
    while(nem.count(csapat)>0);
    printf("A véletlenszerűen kiválasztott csapat: %d\n", csapat);

    bool gyalog=false;                          // gyalog mennek-e a szerelők
    bool kezd=true;                             // az adott csapat először kezdő állapotát nézem-e
    int kiszallas;                              // ahol kiszállnak a liftből
    for(auto elem:igenyek)
    {
        if(elem.cs==csapat)                     // megvan a csapatunk
        {
            if(kezd)                            // most kezdjük vele a viszgálatot
            {
                kiszallas=elem.ki;              // ahol kiszállnak a liftből
                kezd=false;                     // innentől már nem kezdőállapotot nézünk majd
            }
            else
            {
                if(elem.be!=kiszallas)          // ha a beszállási hely eltér attól ahol előzőleg hagyták a liftet, akkor gyalog mentek a két szint között
                {
                    printf("Gyalogosan közlekedtek a(z) %d. ", kiszallas);
                    printf("és  a(z) %d. szint között!\n", elem.be);
                    gyalog=true;                // volt gyaloglás
                }
                kiszallas=elem.ki;          // ezt ne felejtsük el aktualizálni...
            }
        }
    }
    if(!gyalog) printf("Nem bizonyítható szabálytalanság!\n");    // ha nem volt gyaloglás a vizsgálat végén, akkor...
}

void F8(vector<igeny> igenyek)
{
    cout << "****************************************************************\n8. feladat - adatok kiírása..." << endl;
    ofstream fki;
    int fkod;
    string siker;
    fki.open("blokkol.txt");
    for(auto elem:igenyek)
    {
        if(elem.cs==csapat)
        {
            cout << "Indulási emelet: " << elem.be << endl;           // képernyőre
            fki << "Indulási emelet: " << elem.be << endl;            // fájlba
            cout << "Célemelet: " << elem.ki << endl;
            fki << "Célemelet: " << elem.ki << endl;
            cout << "Feladatkód: ";
            cin >> fkod;
            fki << "Feladatkód: " << fkod << endl;
            cout << "Befejezés ideje: " << elem.o << ":" << elem.p << ":" << elem.mp << endl;
            fki << "Befejezés ideje: " << elem.o << ":" << elem.p << ":" << elem.mp << endl;
            cout << "Sikeresség: ";
            cin >> siker;
            fki << "Sikeresség: " << siker << endl;
        }
    }
    fki.close();
}

int main()
{
    setlocale(LC_ALL,"");

    vector<igeny> igenyek;
    igenyek.reserve(100);
    F1(igenyek);
    F2();
    F3(igenyek);
    F4(igenyek);
    F5(igenyek);
    F6(igenyek);
    F7(igenyek);
    F8(igenyek);
    return 0;
}
