#include <iostream>
#include <fstream>

using namespace std;

struct adatok
{
    string aru[20];    //maximum 20 áru lehet egy vevőnél
    int ar[20];  //Érdemes az áruk árát is rögtön rögzíteni;
    int db;     //ennyi áru van a vevőnél
};

adatok vevo[1000];      //Kevesebb is elég lenne: mondjuk 500 :)

//Az egyszerűség kedvéért globálisak!!
int f_db;       //FIZETÉSEK száma
int x_ssz, x_db;        //4. feladathoz és az utána jövő feladatokhoz
string x_aru;       //4. feladathoz és az utána jövő feladatokhoz

void kiir(string sz)
{
    cout << sz << endl;
}

void rendez(int v, int a)
{
    if(a>0)
    {
        //RENDEZZÜNK
        for(int i=0;i<a-1;i++)
        {
            for(int j=i+1;j<a;j++)
            {
                if(vevo[v].aru[i]>vevo[v].aru[j])
                {
                    swap(vevo[v].aru[i],vevo[v].aru[j]);
                    swap(vevo[v].ar[i],vevo[v].ar[j]);
                }
            }
        }
        //Beárazás
        int azonos_db=0;
        vevo[v].ar[0]=500;
        for(int i=1;i<a;i++)
        {
            if(vevo[v].aru[i]==vevo[v].aru[i-1])
            {
                azonos_db++;
                if(azonos_db>1) vevo[v].ar[i]=400;
                else vevo[v].ar[i]=450;
            }
            else
            {
                azonos_db=0;
                vevo[v].ar[i]=500;
            }
        }
    }
    else
    {
        vevo[v].ar[a]=500;
    }

}

void F1()
{
    //EBBEN LESZ: Megszámlálás és Rendezés
    ifstream fbe;
    fbe.open("penztar.txt");

    string sor;
    f_db=0;
    int i=0;        //Vevő indexeléséhez
    int j=0;        //Egy vevő áruinak indexeléséhez

    while(!fbe.eof())
    {
        getline(fbe,sor);
        if(sor=="F")
        {
            rendez(i,j);    //Muszáj rendezni az adott vevő áruit, mert összevissza lehetnek az árunevek,
            //rendezve viszont meg tudjuk állapítani az azonos áruneveket és így az áraikat is!
            vevo[i].db=j;   //Mennyi áru van az adott vevőnél
            f_db++;  //FIZETÉSEK számlálása
            i++;        //Következő vevő indexe
            j=0;        //Új vevő jön, így az árukat is újra indexeljük
        }
        else
        {
            //Vásárolt áruk feldolgozása (max 20)
            vevo[i].aru[j]=sor;
            j++;    //áru index léptetése, ezért majd a vevo[i].db jó lesz (a ++ miatt)!
        }

    }
    //BEOLVASOTT ADATOK KÉPERNYŐRE ÍRÁSA
    //CSAK AZ ÖNKONTROLL KEVÉÉRT! :)
    for(int i=0;i<f_db;i++)                      //VEVŐK
    {
        cout << i+1 << ". vevő:" << endl;
        for(int j=0;j<vevo[i].db;j++)              //ÉS ÁRUIK
        {

            cout << vevo[i].aru[j] << ", ";
            cout << vevo[i].ar[j] << endl;

        }
    }
}

void F2()
{
    cout << "A fizetések száma: " << f_db << endl;
}

void F3()
{
    cout << "Az első vásárló " << vevo[0].db << " db árucikket vásárolt." << endl;
}

void F4()
{
    cout << "Adja meg egy vásárlás sorszámát! ";
    cin >> x_ssz;
    cout << "Adja meg egy árucikk nevét! ";
    cin >> x_aru;
    cout << "Adja meg a vásárolt darabszámot! ";
    cin >> x_db;
}

void F5()
{
    //EBBEN LESZ: Lineáris keresés és lesz Megszámlálás
    int elso, utolso, alkalom=0, db=0;
    //Kérdés: készítsünk klasszikus keresést, vagy FOR ciklussal rohanjunk végig az adatokon? Hm?
    //Az általunk kitalált adatszerkezet miatt egyszerűbb a FOR ciklusos keresés
    elso=0;
    for(int i=0;i<f_db;i++)                  //VEVŐK
    {

        for(int j=0;j<vevo[i].db;j++)          //ÉS ÁRUIK
        {
            if(vevo[i].aru[j]==x_aru)
            {
                if(elso==0) elso=i+1;   //+1, csak a szokásos indexelés és darab viszony :)
                utolso=i+1;
                db++;
            }
        }
        if(db>0) alkalom++;
        db=0;
    }
    cout << "Az első vásárlás sorszáma: " << elso << endl;
    cout << "Az utolsó vásárlás sorszáma: " << utolso << endl;
    cout << alkalom << " vásárlás során vettek belőle." << endl;
}

int ertek(int darab)
{
    int fizess=0;
    for(int i=0;i<darab;i++)
    {
        if(i<3) fizess+=(500-i*50);
        else fizess+=400;
    }
    return fizess;
}

void F6()
{
    cout << x_db << " darab vételekor fizetendő: " << ertek(x_db) << endl;
}

void F7()
{
    int i=x_ssz-1;
    int db=1;
    for(int j=1;j<vevo[i].db+1;j++)
    {
        db=1;
        while(vevo[i].aru[j-1]==vevo[i].aru[j])
        {
            j++; db++;
        }
        cout << db << " " << vevo[i].aru[j-1] << endl;
    }
}

void F8()
{
    ofstream fki;
    fki.open("osszeg.txt");
    int v_fizet;
    for(int i=0;i<f_db;i++)                  //VEVŐK
    {
        v_fizet=0;
        for(int j=0;j<vevo[i].db;j++)          //ÉS ÁRUIK
        {
            v_fizet+=vevo[i].ar[j];
        }
        fki << i+1 << ": " << v_fizet << endl;
    }
    fki.close();
}

int main()
{
    setlocale(LC_ALL, "hun");
    kiir("1. feladat");
    F1();
    kiir("2. feladat");
    F2();
    kiir("3. feladat");
    F3();
    kiir("4. feladat");
    F4();
    kiir("5. feladat");
    F5();
    kiir("6. feladat");
    F6();
    kiir("7. feladat");
    F7();
    kiir("8. feladat");
    F8();

    return 0;
}
