#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

void igazolt_igazolatlan(string hiany,int darab[])
{
    darab[0]=0,darab[1]=0;
    for(int i=0;i<hiany.size();i++)
    {
        if(hiany[i]=='X') darab[0]++;
        if(hiany[i]=='I') darab[1]++;
    }
}

void F1(vector<string> &h,map<string,int> &n_h)
{
    ifstream fbe;
    fbe.open("naplo.txt");
    string sor, datum, nev;

    while(getline(fbe,sor))
    {
        if(sor[0]=='#')
        {
            datum=sor+"@";
        }
        else
        {
            nev=sor.substr(0,sor.size()-8);
            n_h[nev]=0;
            sor=datum+sor;
            h.push_back(sor);
        }
    }
    fbe.close();
}

void F2(vector<string> h)
{
    cout << "------------------- 2. feladat -------------------" << endl;
    printf("A naplóban %d bejegyzés van.\n",h.size());
}

void F3(vector<string> h,map<string,int> &n_h)
{
    cout << "------------------- 3. feladat -------------------" << endl;
    int ok=0,nemok=0,kukac;
    string nev;
    int darab[2];
    for(auto elem:h)
    {
        igazolt_igazolatlan(elem.substr(elem.size()-7,elem.size()),darab);
        ok+=darab[0];
        nemok+=darab[1];
        kukac=elem.find('@')+1;
        nev=elem.substr(kukac,elem.size()-(8+kukac));
        n_h[nev]+=(darab[0]+darab[1]);

    }
    printf("Az igazolt hiányzások száma %d, az igazolatlanoké %d óra.\n",ok,nemok);
}

string hetnapja(int honap,int nap)
{
    string napnev[7]= {"vasarnap", "hetfo", "kedd", "szerda", "csutortok", "pentek", "szombat"};
    int napszam[12]={0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 335};
    int napsorszam=(napszam[honap-1]+nap)%7;
    return napnev[napsorszam];
}

void F5()
{
    cout << "------------------- 5. feladat -------------------" << endl;
    int honap,nap;
    cout << "A hónap sorszáma=";
    cin >> honap;
    cout << "A nap sorszáma=";
    cin >> nap;
    cout << "Azon a napon " << hetnapja(honap,nap) << " volt." << endl;

}

void F6(vector<string> h)
{
    cout << "------------------- 6. feladat -------------------" << endl;
    string napneve;
    int ora, honap,nap;
    cout << "A nap neve="; cin >> napneve;
    cout << "Az óra sorszáma="; cin >> ora;
    string hianyzasok;
    int db=0;
    for(auto elem:h)
    {
        honap=atoi(elem.substr(2,4).c_str());
        nap=atoi(elem.substr(5,7).c_str());
        if(hetnapja(honap,nap)==napneve)
        {
            hianyzasok=elem.substr(elem.size()-7,elem.size());
            if(hianyzasok[ora-1]=='X'||hianyzasok[ora-1]=='I') db++;
        }
    }
    printf("Ekkor összesen %d óra hiányzás történt.\n",db);
}

bool hasonlit(pair<string, int>& a,pair<string, int>& b)
{
    return a.second > b.second;     // csökkenő rendezés
}

void sorting(map<string, int> &n_h,vector<pair<string, int>> &t)
{
    //vector<pair<string, int>> temp;
    for (auto items:n_h)
    {
        t.push_back(items);
    }
    sort(t.begin(),t.end(),hasonlit);
}

void F7(map<string,int> n_h)
{
    cout << "------------------- 7. feladat -------------------" << endl;
    vector<pair<string, int>> temp;
	sorting(n_h,temp);
	int maxi=temp[0].second;
	cout << "A legtöbbet hiányzó tanulók: " << temp[0].first << " ";
	int i=1;
	while(temp[i].second==maxi)
    {
        cout << temp[i].first << " ";
        i++;
    }
    cout << endl;
}

int main()
{
    setlocale(LC_ALL,"");

    vector<string> hianyzasok;
    map<string,int> nevszerinti_hianyzasok;
    F1(hianyzasok,nevszerinti_hianyzasok);
    F2(hianyzasok);
    F3(hianyzasok,nevszerinti_hianyzasok);
    F5();
    F6(hianyzasok);
    F7(nevszerinti_hianyzasok);
    return 0;
}
