#include <iostream>     // cin és cout parancsok
#include <fstream>      // fájlkezelés
#include <vector>       // vector adattípushoz

using namespace std;

struct adat
{
    string allomas;     // megálló sorszáma
    string fido;        // felszállás ideje (ééééhhnn-óópp)
    string id;          // kártya azonosító
    string berlet;      // bérlet típusa vagy JGY (jeggyel utazó)
    string lejar;       // dátum vagy 0-10 közötti érték
};

void F1(vector<adat> &a)
{
    ifstream fbe;
    fbe.open("utasadat.txt");
    adat temp;
    while(fbe>>temp.allomas&&fbe>>temp.fido&&fbe>>temp.id&&fbe>>temp.berlet&&fbe>>temp.lejar)
    {
        a.push_back(temp);
    }
    fbe.close();
}

void F2(vector<adat> a)
{
    cout << "2. feladat" << endl;
    printf("A buszra %d utas akart felszállni.\n",a.size());
}

void F3(vector<adat> a)
{
    cout << "3. feladat" << endl;
    // nem szállhat fel valaki, ha lejárt a bérlete vagy nincs már jegye
    int nem=0;
    bool ervenytelen;
    for(auto elem:a)
    {
        ervenytelen=(elem.berlet!="JGY"&&elem.lejar<elem.fido.substr(0,8))||(elem.berlet=="JGY"&&elem.lejar=="0");
        if(ervenytelen)
        {
            nem++;
        }
    }
    printf("A buszra %d utas nem szállhatott fel.\n",nem);
}

void F4(vector<adat> a)
{
    cout << "4. feladat" << endl;
    vector<int> megallo;
    megallo.reserve(30);
    for(int i=0;i<30;i++) megallo[i]=0;
    for(auto elem:a)
    {
        megallo[atoi(elem.allomas.c_str())]++;      // atoi: standard c stringet (c_str()) alakít integerré
    }
    int max_felszallo=0, allomas;
    for(int i=0;i<30;i++)
    {
        if(megallo[i]>max_felszallo)
        {
            max_felszallo=megallo[i];
            allomas=i;
        }
    }
    printf("A legtöbb utas (%d fő) a %d. megállóban próbált felszállni.\n",max_felszallo,allomas);
}

void F5(vector<adat> a)
{
    cout << "5. feladat" << endl;
    // FEB Felnőtt bérlet
    // TAB Tanulóbérlet (kedvezményes)
    // NYB Nyugdíjas bérlet (kedvezményes)
    // NYP 65 év feletti bérlet (ingyenes)
    // RVS Rokkant, vak, siket vagy kísérő bérlet (ingyenes)
    // GYK Iskolakezdés előtti gyerekbérlet (ingyenes)
    // JGY Jegy
    int ingyen=0, kedvezmeny=0;
    bool ingyenes, kedvezmenyes,ervenyes;
    for(auto elem:a)
    {
        ervenyes=(elem.berlet!="JGY"&&elem.lejar>=elem.fido.substr(0,8));
        if(ervenyes)
        {
            ingyenes=(elem.berlet=="NYP"||elem.berlet=="RVS"||elem.berlet=="GYK");
            kedvezmenyes=(elem.berlet=="TAB"||elem.berlet=="NYB");
            if(ingyenes) ingyen++;
            if(kedvezmenyes) kedvezmeny++;
        }
    }
    printf("Ingyenesen utazók száma: %d fő\n",ingyen);
    printf("A kedvezményesen utazók száma: %d fő\n",kedvezmeny);
}
int napokszama(int e1, int h1, int n1, int e2, int h2, int n2)
{
    h1 = (h1 + 9) % 12;
    e1 = e1 - h1 / 10;
    int d1 = 365*e1 + e1 / 4 - e1 / 100 + e1 / 400 + (h1*306 + 5) / 10 + n1 - 1;
    h2 = (h2 + 9) % 12;
    e2 = e2 - h2 / 10;
    int d2 = 365*e2 + e2 / 4 - e2 / 100 + e2 / 400 + (h2*306 + 5) / 10 + n2 - 1;
    return d2-d1;
}

void F7(vector<adat> a)
{
    ofstream fki;
    fki.open("figyelmeztetes.txt");
    int e1,h1,n1,e2,h2,n2;
    int nap;
    for(auto elem:a)
    {
        if(elem.berlet!="JGY")
        {
            e1=atoi(elem.fido.substr(0,4).c_str());
            h1=atoi(elem.fido.substr(4,2).c_str());
            n1=atoi(elem.fido.substr(6,2).c_str());
            e2=atoi(elem.lejar.substr(0,4).c_str());
            h2=atoi(elem.lejar.substr(4,2).c_str());
            n2=atoi(elem.lejar.substr(6,2).c_str());
            nap=napokszama(e1,h1,n1,e2,h2,n2);
            if(nap>=0&&nap<=3)
            {
                fki << elem.id << " " << elem.lejar.substr(0,4) << "-" << elem.lejar.substr(4,2) << "-" << elem.lejar.substr(6,2) << endl;
            }
        }
    }
    fki.close();
}

int main()
{
    setlocale(LC_ALL,"");
    vector<adat> adatok;
    F1(adatok);
    F2(adatok);
    F3(adatok);
    F4(adatok);
    F5(adatok);
    F7(adatok);
    return 0;
}
