#include <iostream>     // cin és cout parancsok
#include <fstream>      // fájlkezelés
#include <vector>       // vector adattípushoz
#include <algorithm>    // vector reverse függvényhez
#include <string>       // string substr függvényhez
#include <set>          // set (halmaz) adattípushoz
#include <cmath>        // round (kerekítés)

using namespace std;

struct jelentes
{
    string telepules,ido,szel;
    int homerseklet;
};

set<string> telepulesek;    // 5. és 6. feladathoz

void F1(vector<jelentes> &j)
{
    ifstream fbe;
    fbe.open("tavirathu13.txt");
    jelentes temp;
    while(fbe>>temp.telepules&&fbe>>temp.ido&&fbe>>temp.szel&&fbe>>temp.homerseklet)
    {
        j.push_back(temp);
    }
    fbe.close();
}

void F2(vector<jelentes> j)
{
    cout << "2. feladat" << endl;
    string t;       // település kódja
    cout << "Adja meg egy település kódját! Település: ";
    cin >> t;
    bool van=false;
    reverse(j.begin(),j.end());
    for(auto elem:j)
    {
        if(elem.telepules==t)
        {
            cout << "Az utolsó mérési adat a megadott településről " << elem.ido.substr(0,2) << ":" << elem.ido.substr(2,2) << "-kor érkezett." << endl;
            van=true;
            break;
        }
    }
    if(van==false) cout << "Ilyen település nincs..." << endl;
    reverse(j.begin(),j.end());     // eredeti sorrend visszaállítása
}

bool homerseklet_szerint(jelentes a, jelentes b)
{
    return a.homerseklet < b. homerseklet;
}

void F3(vector<jelentes> j)
{
    cout << "3. feladat" << endl;
    vector<jelentes> temp=j;
    sort(temp.begin(),temp.end(),homerseklet_szerint);
    jelentes mini=temp[0];
    jelentes maxi=temp[temp.size()-1];
    cout << "A legalacsonyabb hőmérséklet: " << mini.telepules << " " << mini.ido.substr(0,2) << ":" << mini.ido.substr(2,2) << " ";
    cout << mini.homerseklet << " fok." << endl;
    cout << "A legmagasabb hőmérséklet...: " << maxi.telepules << " " << maxi.ido.substr(0,2) << ":" << maxi.ido.substr(2,2) << " ";
    cout << maxi.homerseklet << " fok." << endl;
}

void F4(vector<jelentes> j)
{
    cout << "4. feladat" << endl;
    bool van=false;
    for (auto elem:j)
    {
        if(elem.szel=="00000")
        {
            if(van==false) van=true;
            cout << elem.telepules << " " << elem.ido.substr(0,2) << ":" << elem.ido.substr(2,2) << endl;
        }
    }
    if(van==false)
    {
        cout << "Nem volt szélcsend a mérések idején." << endl;
    }
}

// 1., 7., 13., 19 órák számítanak
void F5(vector<jelentes> j)
{
    cout << "5. feladat" << endl;
    set<string> orak={"01","07","13","19"};
    set<string> kontroll;
    int maxi, mini;
    // telepulesek globálisan definiált halmaz (lsd. program elején)
    for(auto elem:j)
    {
        telepulesek.insert(elem.telepules);
    }
    int kh,db;
    bool hiany=false;
    // települések halmaza alapján végignézzük az összes települést
    for(auto t:telepulesek)
    {
        kh=0;
        db=0;
        maxi=0;
        mini=100;
        // a teljes táviratot (jelentést) végignézzük,...
        for(auto elem:j)
        {
            // ...és ha a mi településünk jön
            if(elem.telepules==t)
            {
                // hőmérséklet-ingadozást minden adatra számolunk, de...
                if(elem.homerseklet>maxi) maxi=elem.homerseklet;
                if(elem.homerseklet<mini) mini=elem.homerseklet;
                //... középhőmérsékletet csak a megadott órákra
                if(orak.count(elem.ido.substr(0,2)))
                {
                    kh+=elem.homerseklet;
                    db++;
                    kontroll.insert(elem.ido.substr(0,2));
                }
            }
        }
        if(kontroll.size()!=4) cout << t << " NA; ";
        else cout << t << " Középhőmérséklet: " << round((float)kh/(float)db) << "; ";
        cout << "Hőmérséklet-ingadozás: " << (maxi-mini) << endl;
        kontroll.clear();
    }
}

void F6(vector<jelentes> j)
{
    cout << "6. feladat" << endl;
    ofstream fki;
    for(auto t:telepulesek)
    {
        fki.open(t+".txt");
        fki << t << endl;
        for(auto elem:j)
        {
            if(elem.telepules==t)
            {
                fki << elem.ido.substr(0,2) << ":" << elem.ido.substr(2,2) << " ";
                for(int i=0;i<atoi(elem.szel.substr(3,5).c_str());i++)
                {
                    fki << "#";
                }
                fki << endl;
            }
        }
        fki.close();
    }
    cout << "Fájlok kész!" << endl;
}

int main()
{
    setlocale(LC_ALL,"");
    vector<jelentes> jelentesek;
    F1(jelentesek);
    F2(jelentesek);
    F3(jelentesek);
    F4(jelentesek);
    F5(jelentesek);
    F6(jelentesek);
    return 0;
}
