#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <math.h>

using namespace std;

int jegyekSzama, vonalHossz, egysegAr;
int megallok[200]; ///legszélsöségesebb eset, ide gyüjtjük a megállókat 6. feladathoz
struct egyjegy{

    int ules, fel, le;

}jegy[500];

void beolvasas();                   ///fájl beolvasása
int tavolsag(int utas);             ///az utas által beutazott távolság
int kerekites(int szam);            ///a legközelebbi  öttel osztható számra kerekít
bool bennevan(int szam);            ///a szam benne van-e a tomb-ben?
int foglalt(int ules, int tav);     ///7. feladathoz, megadja, hogy az ülés foglalt-e, ha foglalt, akkor az utas sorszámával tér vissza
void kiir();                        ///fájlbaírás

int main()
{
    setlocale(LC_ALL, "hun");
    cout << "1. feladat: Beolvasás" << endl;
    beolvasas();
    cout << "A beolvasásás sikerült." << endl;

    cout << "2. feladat: Legutolsó utas ülésének sorszáma és butazott távolsága:" << endl;
    cout << "Ülése: " << jegy[jegyekSzama-1].ules << ", beutazott távolsága: " << tavolsag(jegyekSzama) << endl;

    cout << "3. feladat: Azok az utasok, akik végig utazták az utat: " << endl;
    for(int i=1; i<=jegyekSzama; i++) {
        if(tavolsag(i)==vonalHossz) cout << i << " ";
    }
    cout << endl;

    cout << "4. feladat: Az eladott jegyekből származott bevétel: " << endl;
    int bevetel=0;
    for(int i=1; i<=jegyekSzama; i++) {
        bevetel+=kerekites(ceil(tavolsag(i))/10*egysegAr); ///ceil felfelé kerekíti a távolságot
    }
    cout << bevetel << " Ft" << endl;

    cout << "5. feladat: Az utolsó megállónál le- és fellszáló utasok: " << endl;
    ///Megkeressük az utolsó megálló helyét
    int utolso=0;
    for(int i=0; i<jegyekSzama; i++){
        if(jegy[i].fel>utolso) utolso=jegy[i].fel;
        if(jegy[i].le>utolso && jegy[i].le!=vonalHossz) utolso=jegy[i].le;
    }
    ///leszámláljuk, hogy hányan szálltak itt le és fel
    int leDb=0, felDb=0;

    for(int i=0; i<jegyekSzama; i++){
        if(jegy[i].le==utolso) leDb++;
        if(jegy[i].fel==utolso) felDb++;
    }
    cout << "Az utolsó megállónál leszállók száma: " << leDb << ", felszállók száma: " << felDb << endl;

    cout << "6. feladat: Megállók száma: " << endl;

    int j=0;
    int ujmegallo=0;
    ///kigyüjtjük a megállókat.
    ///a fel- vagy leszállás km-ét betesszük a tömbbe, ha még nincs ott, illetve, ha nem kezdő vagy végállomás
    for(int i=0; i<jegyekSzama; i++) {

        if(jegy[i].fel!=0 && !bennevan(jegy[i].fel)) {
            megallok[j]=jegy[i].fel;
            ujmegallo++;
            j++;
        }
        if(jegy[i].le!=vonalHossz  && !bennevan(jegy[i].le)){
            megallok[j]=jegy[i].le;
            ujmegallo++;
            j++;
        }

    }
    cout << "A megállók száma: " << ujmegallo << endl; /// ide jó lenne a j értéke is!

    cout << "7. feladat: Utaslista készítése: " << endl;
    kiir();
    cout << "A fájlbaírás sikerült. " << endl;

    cin.get();
    return 0;
}

void beolvasas(){

    ifstream be;
    be.open("eladott.txt");
    if(be.fail()) {

        cout << "A fájl nem nyitható meg";
        cin.get();
        exit(-1);
    }
    be >> jegyekSzama >> vonalHossz >> egysegAr;    ///A darabszám, vonal hosszának és az egysegár beolvasása
    int i=0;
    while(!be.eof()) {
       be >> jegy[i].ules >> jegy[i].fel >> jegy[i].le;
       i++;
    }

    be.close();


}

int tavolsag(int utas){

    return jegy[utas-1].le-jegy[utas-1].fel;

}

int kerekites(int szam){

    return (szam+2)/5*5;  ///a legközelebbi ötösre kerekít

}

bool bennevan(int szam){

 bool van=false;
 unsigned int k=0;
    /*
    for(int i=0; i<sizeof(megallok)/sizeof(int); i++) {

     if(megallok[i]==szam) van=true;
    }
    */
 ///do-while ciklus kell, mert különben nem fut le egyszer sem
 do{
    if(megallok[k]==szam) van=true;
    k++;
 }while(!van && k!=sizeof(megallok)/sizeof(int));

 return van;
}


int foglalt(int ules, int tav){
    int foglalt=0;
    for(int i=0; i<jegyekSzama; i++) {

        if(jegy[i].fel<tav && jegy[i].le>tav && jegy[i].ules==ules) {
            foglalt=i+1;    ///utas sorszáma
        }else if(jegy[i].fel==tav && jegy[i].ules==ules){ ///csak a felszálló utasokat vesszük figyelembe
            foglalt=i+1;
        }else if(jegy[i].le==vonalHossz && jegy[i].ules==ules){ ///végállomásnál
            foglalt=i+1;
        }

   }
   return foglalt; ///utas sorszáma vagy 0.

}

void kiir(){
    int tav;
    cout << "Adjon meg egy távolságot 0 és " << vonalHossz << " között: ";
    cin >> tav;
    ofstream ki;
    ki.open("kihol.txt");
    if(ki.fail()) {

        cout << "A fájl nem nyitható meg";
        cin.get();
        exit(-1);
    }
    for(int i=1; i<=48; i++) {

        if(foglalt(i,tav)) {
          ki << i << ". ülés: " << foglalt(i,tav) << endl;
        }
        else {
          ki << i << ". ülés: üres" << endl;;
        }
    }
    ki.close();

}
