﻿#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

struct foglalas{
    int foglalassorszam, szobaSzam, erkezes, tavozas, vendegekSzama, reggeli;
    string vendeg;
}egyfoglalas[1000];

struct honap{
    int napszam, kezdonap;
    string nev;
}egyhonap[12];

int db; ///foglalások száma

int tartozkodas_hossza(foglalas egyfoglalas);

int szamla(foglalas egyfoglalas); ///egy foglalás utáni számla

int honap(int nap); ///melyik hónap napja

bool szabadszoba(int szobaSzam, int kezdonap, int ejszakakSzama);


ifstream be, be2;
ofstream ki;

int main()
{
    setlocale(LC_ALL,"hun");
    cout << "1. feladat: beolvasás" << endl;

    be.open("pitypang.txt");
    if(be.fail()) {

        cout << "A fájl nem nyítható meg!";
        cin.get();
        exit(-1);

    }
    int i=0;

    be >> db; ///foglalások számának beolvasása
    while(!be.eof()) {
        be >> egyfoglalas[i].foglalassorszam >>  egyfoglalas[i].szobaSzam >> egyfoglalas[i].erkezes >> egyfoglalas[i].tavozas >> egyfoglalas[i].vendegekSzama >> egyfoglalas[i].reggeli >> egyfoglalas[i].vendeg;
        i++;
    }
    ///2. feladat
    cout << "2. feladat: A leghosszabb tartózkodás" << endl;
    int leghosszabbtartozkodas=tartozkodas_hossza(egyfoglalas[0]);
    int leghosszabbtartozkodasindexe=0;
    for(i=1; i<db; i++) {

        if(tartozkodas_hossza(egyfoglalas[i])>leghosszabbtartozkodas) {

            leghosszabbtartozkodasindexe=i;

        }

    }
    cout << egyfoglalas[leghosszabbtartozkodasindexe].vendeg << "(" << egyfoglalas[leghosszabbtartozkodasindexe].erkezes << ")" << "-" << tartozkodas_hossza(egyfoglalas[leghosszabbtartozkodasindexe]) << endl;

    ///3. feladat
    cout << "3. feladat: Foglalások utáni számla" << endl;
    ki.open("bevetel.txt");
    if(ki.fail()) {

        cout << "A fájl nem nyítható meg!";
        cin.get();
        exit(-1);

    }
    int osszbevetel=0;
    for(i=0; i<db; i++) {
        ki << egyfoglalas[i].foglalassorszam << ":" << szamla(egyfoglalas[i]) << endl;
        osszbevetel+=szamla(egyfoglalas[i]);
    }
    cout << "A szálloda teljes bevétele: " << osszbevetel << endl;
    ki.close();

    ///4. feladat
    be2.open("honapok.txt");
    if(be2.fail()) {

        cout << "A fájl nem nyítható meg!";
        cin.get();
        exit(-1);

    }
    i=0;
    while(be2>>egyhonap[i].napszam>>egyhonap[i].kezdonap>>egyhonap[i].nev){
        i++;
    }
    be2.close();

    int honapEj[12];       ///ebben tároljuk a vendégéjszakák számát havonként
    for(i=0;i<12;i++){
        honapEj[i]=0;
    }

    for(i=0;i<db;i++) {

        for(int j=egyfoglalas[i].erkezes;j<egyfoglalas[i].tavozas;j++){
            if(honap(j)==1)  honapEj[0]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==2)  honapEj[1]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==3)  honapEj[2]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==4)  honapEj[3]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==5)  honapEj[4]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==6)  honapEj[5]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==7)  honapEj[6]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==8)  honapEj[7]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==9)  honapEj[8]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==10)  honapEj[9]+=egyfoglalas[i].vendegekSzama;
            else if (honap(j)==11)  honapEj[10]+=egyfoglalas[i].vendegekSzama;
            else honapEj[11]+=egyfoglalas[i].vendegekSzama;
        }
    }
    for(i=0;i<12;i++) {
        cout << i+1 << ": " << honapEj[i] << " vendégéj" << endl;
    }

    ///5. feladat
    cout << "5. feladat: Üres szobák. " << endl;
    cout << "Adja meg a foglalás kezdõnapját és az eltöltendõ éjszakák számát: ";
    int kezdonap, ejszakakSzama;
    cin >> kezdonap >> ejszakakSzama;

    for(int i=1; i<=27; i++){
        if(szabadszoba(i,kezdonap, ejszakakSzama)) cout << "Az " << i << ". szoba szabad ebben az idõszakban." << endl;
    }



    return 0;
}

int tartozkodas_hossza(foglalas egyfoglalas) {
///megadja, hogy hány napot tartózkodott a szállodában
    return egyfoglalas.tavozas-egyfoglalas.erkezes;

}

bool szabadszoba(int szobaSzam, int kezdonap, int ejszakakSzama) {
    int tavozasnap=kezdonap+ejszakakSzama;
    bool szabad = true;
    int i=0;
    ///egy szoba akkor válik foglalttá, ha nem teljesül az, hogy az új vendég érkezésének és távozásának napja a
    ///a meglévõ foglalás érkezésénél kisebb vagy a távozásánál nagyobb.
    while(szabad && i<db) {
        if(egyfoglalas[i].szobaSzam==szobaSzam && !((kezdonap<egyfoglalas[i].erkezes && tavozasnap<egyfoglalas[i].erkezes)
                                                || (kezdonap>egyfoglalas[i].tavozas && tavozasnap>egyfoglalas[i].tavozas))) szabad=false;
    i++;
    }

return szabad;
}

int szamla(foglalas egyfoglalas){
    ///feltételezzük, hogy a fogalalások között nincs átnyúlás az egyes idöszakok között
    int szobaar, koltseg;
    if(egyfoglalas.erkezes<121) szobaar=9000;
    else if(egyfoglalas.erkezes<244) szobaar=10000;
    else szobaar=8000;
    ///teljes szobaár
    koltseg=tartozkodas_hossza(egyfoglalas)*szobaar;
    if(egyfoglalas.vendegekSzama==3) koltseg+=tartozkodas_hossza(egyfoglalas)*2000;
    ///reggeli
    if(egyfoglalas.reggeli) koltseg+=egyfoglalas.vendegekSzama*tartozkodas_hossza(egyfoglalas)*1100;


return koltseg;
}

int honap(int nap){  ///melyik hónap napja
   if(nap<32)  return 1;
   else if(nap<60) return 2;
   else if(nap<91) return 3;
   else if(nap<121) return 4;
   else if(nap<152) return 5;
   else if(nap<182) return 6;
   else if(nap<213) return 7;
   else if(nap<244) return 8;
   else if(nap<274) return 9;
   else if(nap<305) return 10;
   else if(nap<335) return 11;
   else return 12;


}
