#include <iostream>         // cin, cout
#include <fstream>          // fájlkezelés
#include <string>           // string (szövegek)
#include <vector>           // vector adattípus
#include <algorithm>        // max_element
#include <iomanip>          // setw, setprecision

using namespace std;

vector<string> beolvas(string fajl)
{
    vector<string> abra;
    ifstream fbe;
    fbe.open(fajl);
    string sor;
    while(getline(fbe, sor))
    {
        abra.push_back(sor);
    }
    fbe.close();
    return abra;
}

bool hossz_szerint(string a, string b)
{
    return a.size() < b.size();
}

void kiir(vector<string> abra, int ism, string fajl)
{
    string sor, ende;
    ofstream fki;
    if(fajl != "")
        fki.open(fajl);
    if(ism == 1)
        ende = "";
    else
        ende = " |  ";
    string maxhossz = *max_element(abra.begin(), abra.end(), hossz_szerint);

    for(auto sor: abra)
    {
        for(int i = 0; i < ism; i++)
        {
            cout << left << setw(maxhossz.size()+2) << sor << ende;
            if(fajl != "") fki << left << setw(maxhossz.size()+2) << sor << ende;
        }
        cout << endl;
        if(fajl != "") fki << endl;
    }
    if(fajl != "") fki.close();
}

string atalakit(string blokkok)
{
    string tomoritetlen = "";
    int x;
    for(int i = 0; i < blokkok.size(); i++)
    {
        if(i % 2 == 0)
            x = blokkok[i] - '0';
        else
            for(int j = 0; j < x; j++) tomoritetlen += blokkok[i];
    }
    return tomoritetlen;
}

void szg(string fajlin, string fajlout)
{
    cout << "\n4. feladat" << endl;
    vector<string> forras = beolvas(fajlin);
    vector<string> abra;
    for(string sor: forras)
        abra.push_back(atalakit(sor));
    kiir(abra, 1, fajlout);
}

void tomorites_vizsgalat()
{
    cout << "\n5. feladat" << endl;
    string t1, t2;

    cout << "Kérem adja meg a tömörített ábra fájlnevét: ";         // konyv_t.txt
    cin >> t1;
    cout << "Kérem adja meg a tömörítetlen ábra fájlnevét: ";       // konyv.txt
    cin >> t2;
    ifstream fbe1, fbe2;
    fbe1.open(t1);
    fbe2.open(t2);
    string sor, text1 = "", text2 = "";
    while(getline(fbe1, sor)) text1 += sor;
    while(getline(fbe2, sor)) text2 += sor;
    int t1_hossz = text1.size() - count(text1.begin(), text1.end(), '\n');
    int t2_hossz = text2.size() - count(text2.begin(), text2.end(), '\n');
    cout << "A karakterek száma a tömörített állományban: " << t1_hossz << endl;
    cout << "A karakterek száma a tömörítetlen állományban: " << t2_hossz << endl;
    cout << "A tömörítési arány: " << setprecision(2) << float(t1_hossz)/float(t2_hossz) << endl;
}

void statisztika(string fajl)
{
    cout << "\n6. feladat" << endl;
    vector<string> abra = beolvas(fajl);
    cout << "Az ábra magassága sorokban: " << abra.size() << endl;
    vector<int> hosszak;
    int blokkok = 0, hossz;
    for(string sor: abra)
    {
        hossz = 0;
        for(int i = 0; i < sor.size(); i++)
        {
            if(i % 2 == 0)
            {
                hossz += (sor[i] - '0');
                blokkok += 1;
            }
        }
        hosszak.push_back(hossz);

    }
    int maxhossz = *max_element(hosszak.begin(), hosszak.end());
    cout << "Az ábra szélessége karakterekben: " << maxhossz << endl;
    cout << "A blokkok száma: " << blokkok << endl;
}

int main()
{
    setlocale(LC_ALL, "");
    cout << "1. feladat" << endl;
    vector<string> konyv = beolvas("konyv.txt");
    kiir(konyv, 1, "");
    cout << "\n2. feladat" << endl;
    int ism;
    cout << "Kérem adja meg az ismétlések számát: ";
    cin >> ism;
    kiir(konyv, ism, "");
    szg("szg_t.txt", "szg.txt");
    tomorites_vizsgalat();
    statisztika("konyv_t.txt");
    return 0;
}
