#include <iostream>
#include <vector>
#include <map>
#include <fstream>
#include <sstream>
#include <stdlib.h>


/* --- MESE ----
ELMŰ budapesti kirendeltségén új számítógépet vesznek, és ezen való örömükben elkezdik a lakossági adatokat digitális formában tárolni.
Elsőként az átalánydíjak adathalmazát szeretnék rendszerezni, ezért a hozzájuk tartozó utcák irányítószámát
(feltételezzük, hogy minden utca irányítószáma különböző), és az utca lakásainak átlagos fogyasztási adatait egy map-be rakják.
Utcánként a házszámok alá tartozó lakások adatait vektorba rakják. Az egyes házszámok alatt található lakások
(tömbházakról van ugyanis szó) adatait pedig ezen belül is egy újabb vectorban tárolják.
*/

using namespace std;

struct villamosmu
{
private:
    map<int, vector<vector<int>>> utcak;
public:
    villamosmu()
    {
        random(); // Első futás után kitörlendő
    }

    /// --- RANDOM ------------------------------------------
    // Ezt a függvényt  csak annyi jelentőssége van, hogy ne nekem kelljen kitalálnom adatokat
    void random()
    {
        for (int i = 0; i < rand()%3+5; i++)
        {
            vector<vector<int>> ideiglenesUtca;
            for (int i = 0; i < rand()%5+5; i++)
            {
                ideiglenesUtca.push_back({});
                for (int j = 0; j < rand()%5+5; j++)
                    ideiglenesUtca[i].push_back(rand()%1000000);
            }
            utcak[rand()%230+1010] = ideiglenesUtca;
        }
    }

    /// --- BEOLVASÁS ------------------------------------------
    void beolvas()
    {
        ifstream f("adatok.txt");

        while (f.good())
        {
            int iranyitoszam;
            string s;
            getline(f, s, ',');
            if (s == "") break;
            {stringstream ss;
            ss << s;
            ss >> iranyitoszam;}

            int i_max;
            getline(f, s, '\n');
            {stringstream ss;
            ss << s;
            ss >> i_max;}

            vector<vector<int>> utca;
            for (int i = 0; i < i_max; i++)
            {
                utca.push_back({});
                int fogyasztas;
                getline(f, s, ',');
                {stringstream ss;
                ss << s;
                ss >> fogyasztas;}
                while(s.find('*') == string::npos && f.good())
                {
                    utca[i].push_back(fogyasztas);
                    getline(f, s, ',');
                    {stringstream ss;
                    ss << s;
                    ss >> fogyasztas;}
                }
                getline(f, s);
            }
            getline(f, s);

            utcak[iranyitoszam] = utca;
        }

        f.close();

        cout << "Sikeres beolvasas." << endl;

    }

    /// --- KIÍRATÁS --------------------------------
    void kiir()
    {
        ofstream f("adatok.txt");

        for (map<int, vector<vector<int>>>::iterator it = utcak.begin(); it != utcak.end(); it++)
        {
            vector<vector<int>> utca = it->second;
            f << it->first << ", " << utca.size() << endl;
            for (unsigned int i = 0; i < utca.size(); i++)
            {
                for (unsigned int j = 0; j < utca[i].size(); j++)
                    f << utca[i][j] << ", ";
                f << "*," << endl;
            }
            f << endl;
        }

        f.close();

        cout << "Sikeres mentes." << endl;
    }

    /// --- BEVITEL ----------------------------
    void bevitel()
    {
        cout << "Adja meg az uj/modositando utca iranyitoszamat: ";
        int iranyitoszam;
        string s;
        stringstream ss;
        getline(cin, s);
        ss << s;
        ss >> iranyitoszam;
        ss.clear();
        cout << endl;

        int fogyasztas;
        int i = 0;
        vector<vector<int>> utca;
        cout << "Adja meg az egyes lakasok fogyasztasat!" << endl;
        cout << "-1 beirasaval a kovetkezo hazszamra ugorhat\n\t-2-vel pedig a bevitel veget jelezheti" << endl << endl;
        while (fogyasztas != -2)
        {
            vector<int> haz;
            cout << "Hazszam: " << ++i << endl;
            int j = 0;

            cout << "\tLakasszam: " << ++j << " - ";
            getline(cin, s);
            ss << s;
            ss >> fogyasztas;
            ss.clear();
            while (0 < fogyasztas)
            {
                haz.push_back(fogyasztas);
                cout << "\tLakasszam: " << ++j << " - ";
                getline(cin, s);
                ss << s;
                ss >> fogyasztas;
                ss.clear();
            }
            utca.push_back(haz);
        }

        utcak[iranyitoszam] = utca;
        cout << endl << "Utca felvetele/modositasa sikeresen megtortent." << endl << endl;
    }

    /// --- LEKÉRDEZÉS ---------------------------------
    void lekerdez()
    {
        cout << "Adjon meg egy limitet, es az ennel nagyobb fogyasztasu lakasokat kilistazom." << endl;
        cout << "Limit: ";
        int limit;
        string s;
        stringstream ss;
        getline(cin, s);
        ss << s;
        ss >> limit;
        ss.clear();

        cout << "Talalatok: " << endl;
        cout << "Iranyitoszam | Hazszam | Lakasszam | Fogyasztasertek" << endl;

        for (map<int, vector<vector<int>>>::iterator it = utcak.begin(); it != utcak.end(); it++)
        {
            vector<vector<int>> utca = it->second;
            for (unsigned int i = 0; i < utca.size(); i++)
            {
                for (unsigned int j = 0; j < utca[i].size(); j++)
                    if (limit < utca[i][j])
                        cout << "     " << it->first << "    |    " << i << "    |     " << j << "     |  " << utca[i][j] << endl;
            }
        }
        cout << endl;
    }
};

/// --- MAIN -------------------------------------
int main()
{
    villamosmu elmu;

    cout << "Udvozli az ELMU-Budapest lakossagi lakossagi fogyasztas-adatbazisa." << endl;
    cout << "Mit tehetek Onert?" << endl;
    cout << "(lehetseges muveletek:\n   1 - fajlbol beolvasas, 2 - fajlba kiiras, 3 - beolvas/modosit adatokat, " << endl;
    cout << "\t4 - ugyfelek szurese fogyasztas szerint, 5 - kilepes)" << endl;
    cout << "Muvelet: ";
    int muvelet;
    string s;
    getline(cin, s);
    {stringstream ss;
    ss << s;
    ss >> muvelet;}
    while (muvelet != 5)
    {
        switch (muvelet)
        {
        case 1:
            elmu.beolvas(); break;
        case 2:
            elmu.kiir(); break;
        case 3:
            elmu.bevitel(); break;
        case 4:
            elmu.lekerdez(); break;
        }

        cout << endl;
        cout << "Kovetkezo muvelet?" << endl;
        cout << "(lehetseges muveletek:\n   1 - fajlbol beolvasas, 2 - fajlba kiiras, 3 - beolvas/modosit adatokat, " << endl;
        cout << "\t4 - ugyfelek szurese fogyasztas szerint, 5 - kilepes)" << endl;
        cout << "Muvelet: ";

        getline(cin, s);
        {stringstream ss;
        ss << s;
        ss >> muvelet;}
    }

    return 0;
}
