class Ido:
    def __init__(self, ora, perc, mperc):
        osszmperc = ora * 3600 + perc * 60 + mperc
        self.ora = osszmperc // 3600
        self.perc = (osszmperc - self.ora * 3600) // 60
        self.mperc = osszmperc % 60

    def __str__(self):
        return str("{0:02d}").format(self.ora) + ':' + str("{0:02d}").format(self.perc) + ':' + str("{0:02d}").format(
            self.mperc)

    def mpbe(self):
        return self.ora * 3600 + self.perc * 60 + self.mperc

    def __add__(self, other):
        return Ido(0, 0, self.mpbe() + other.mpbe())

    def __sub__(self, other):
        return Ido(0, 0, abs(self.mpbe() - other.mpbe()))

    def __gt__(self, other):
        return [False, True][self.mpbe() > other.mpbe()]

    def __eq__(self, other):
        return [False, True][self.mpbe() == other.mpbe()]


class Vendegadat:
    def __init__(self, azon, reszleg, beki, ido):
        self.azon = azon
        self.reszleg = reszleg
        self.beki = beki
        self.ido = ido


class Fajl:
    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        f = open(self.fnev)
        adatok = []
        for sor in f.readlines():
            azon, reszleg, beki, ora, perc, mperc = sor.split()
            adatok.append(Vendegadat(int(azon), int(reszleg), int(beki), Ido(int(ora), int(perc), int(mperc))))
        f.close()
        return adatok

    def kiir(self, adatok):
        """fajlba iras"""
        f = open(self.fnev, 'w')
        print(adatok, end='', file=f)
        f.close()


class Furdoadat:
    def __init__(self, adatok=None):
        if adatok is None:
            adatok = []
        self.vendegadatok = adatok

    def elsovendeg(self) -> Ido:
        """elso vendeg oltozobol valo kilepesi ideje"""
        return self.vendegadatok[0].ido

    def utolsovendeg(self) -> Ido:
        """utolso vendeg oltozobol valo kilepesi ideje"""
        return [vendeg for vendeg in self.vendegadatok if vendeg.reszleg == 0 and vendeg.beki == 1][-1].ido

    def egyreszlegesek_szama(self) -> int:
        """azok a vendegek, akik csak reszlegen jartak"""
        stat = {}
        for vendeg in self.vendegadatok:
            stat[vendeg.azon] = stat.get(vendeg.azon, 0) + 1
        stat = list(stat.values())
        return stat.count(4)  # akik 4 bejegyzessel vannak!

    def tartozkodasi_idok(self) -> list:
        """vendegek furdoben tartozkodasi ideje"""
        stat = {}
        for vendeg in self.vendegadatok:
            if vendeg.reszleg == 0:
                if vendeg.beki == 1:
                    stat[vendeg.azon] = stat.get(vendeg.azon, Ido(0, 0, 0)) + vendeg.ido
                else:
                    stat[vendeg.azon] = stat.get(vendeg.azon) - vendeg.ido
        stat = list(stat.items())
        return stat

    def legtobb_tarozkodasok(self) -> list:
        """leghosszabb tartozkodas"""
        legtobb = []
        maxido = Ido(0, 0, 0)
        for azon, ido in self.tartozkodasi_idok():
            if ido > maxido:
                maxido = ido
        for azon, ido in self.tartozkodasi_idok():
            if ido == maxido:
                legtobb.append([azon, ido])
        return legtobb

    def legtobb_tarozkodasok_kiir(self) -> str:
        """a legtobb idot a furdoben tartozkodok kiir"""
        sz = 'A legtöbbet a fürdőben tartozkodó vendég(ek):\n'
        for azon, ido in self.legtobb_tarozkodasok():
            sz += str(azon) + '. vendég ' + str(ido) + '\n'
        return sz

    def idostat(self) -> dict:
        """idokozonkent erkezo vendegek szama"""
        stat = {'6-9': 0, '9-16': 0, '16-20': 0}
        for vendeg in self.vendegadatok:
            if vendeg.reszleg == 0 and vendeg.beki == 1:
                if Ido(5, 59, 59) < vendeg.ido < Ido(9, 0, 0):
                    stat['6-9'] += 1
                elif Ido(8, 59, 59) < vendeg.ido < Ido(16, 0, 0):
                    stat['9-16'] += 1
                else:
                    stat['16-20'] += 1
        return stat

    def idostat_kiir(self) -> str:
        """idokozonkent erkezo vendegek szama kiir"""
        sz = ''
        for kulcs, adat in self.idostat().items():
            sz += kulcs + ' óra között ' + str(adat) + ' vendég\n'
        return sz

    def szaunastat(self) -> dict:
        """szaunaban tartozkodo vendegek ideje"""
        stat = {}
        for vendeg in self.vendegadatok:
            if vendeg.reszleg == 2:
                if vendeg.beki == 0:
                    stat[vendeg.azon] = stat.get(vendeg.azon, Ido(0, 0, 0)) + vendeg.ido
                else:
                    stat[vendeg.azon] = stat.get(vendeg.azon) - vendeg.ido
        return stat

    def szaunastat_kiir(self) -> str:
        """szaunaban tartozkodo vendegek ideje kiir"""
        sz = ''
        for azon, ido in sorted(self.szaunastat().items()):
            sz += str(azon) + ' ' + str(ido) + '\n'
        return sz

    def reszlegstat(self) -> list:
        """egyes reszlegeket hasznalo vendegek szama"""
        stat = [[], [], [], [], []]
        for vendeg in self.vendegadatok:
            if vendeg.azon not in stat[vendeg.reszleg]:
                stat[vendeg.reszleg].append(vendeg.azon)
        return stat

    def reszlegstat_kiir(self) -> str:
        """egyes reszlegeket hasznalo vendegek szama kiir"""
        sz = ''
        reszlegek = ['Öltöző', 'Uszoda', 'Szaunák', 'Gyógyvizes medencék', 'Strand']
        for i in range(1, 5):
            sz += reszlegek[i] + ': ' + str(len(self.reszlegstat()[i])) + '\n'
        return sz


# 1. feladat
fajl = Fajl('furdoadat.txt')
adatok = fajl.beolvas()
furdo = Furdoadat(adatok)

# 2. feladat
print("2. feladat\nAz első vendég ", furdo.elsovendeg(), "-kor lépett ki az öltözőből", sep='')
print("Az utolsó vendég ", furdo.utolsovendeg(), "-kor lépett ki az öltözőből", sep='')

# 3. feladat
print("3. feladat\nA fürdőben", furdo.egyreszlegesek_szama(), "vendég járt csak egy részlegen.")

# 4. feladat
print("4. feladat\n", furdo.legtobb_tarozkodasok_kiir(), sep='')

# 5. feladat
print("5. feladat\n", furdo.idostat_kiir(), sep='')

# 6. feladat
fajl = Fajl('szaunaOOP.txt')
fajl.kiir(furdo.szaunastat_kiir())
print("6. feladat\nA fájlbaírás kész.")

# 5. feladat
print("7. feladat\n", furdo.reszlegstat_kiir(), sep='')
