class Ido:
    def __init__(self, o=0, p=0, mp=0):
        osszesmp = o * 3600 + p * 60 + mp
        self.o = osszesmp // 3600
        self.p = (osszesmp - self.o * 3600) // 60
        self.mp = osszesmp % 60

    def mpbe(self):
        # 1. feladat
        return self.o * 3600 + self.p * 60 + self.mp

    def __sub__(self, other):
        return Ido(0, 0, abs(self.mpbe() - other.mpbe()))

    def __str__(self):
        return '{:02d}:{:02d}:{:02d}'.format(self.o, self.p, self.mp)

    def __gt__(self, other):
        return [False, True][self.mpbe() > other.mpbe()]

    def __ge__(self, other):
        return [False, True][self.mpbe() >= other.mpbe()]

    def __le__(self, other):
        return [False, True][self.mpbe() <= other.mpbe()]

    def __lt__(self, other):
        return [False, True][self.mpbe() < other.mpbe()]


class Hivas:
    def __init__(self, ssz, kezd, vege):
        self.ssz = ssz
        self.kezd = kezd
        self.vege = vege
        self.hossz = self.vege - self.kezd

    def hossza(self):
        """a hivas hossza masodpercben"""
        return self.hossz.mpbe()

    def __gt__(self, other):
        return [False, True][self.hossz > other.hossz]


class Fajl:
    """Fajlmuveletek osztalya"""

    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        hivasok = []
        f = open(self.fnev)
        sorszam = 0
        for hivas in f.readlines():
            ido = [int(i) for i in hivas.split()]
            sorszam += 1
            hivasok.append(Hivas(sorszam, Ido(*ido[:3]), Ido(*ido[3:])))
        f.close()
        return hivasok

    def kiir(self, adatok):
        """fajlba iras"""
        f = open(self.fnev, 'w', encoding='utf-8')
        print(adatok, end='', file=f)
        f.close()


class Hivasok:
    def __init__(self, hivasok=None):
        if hivasok is None:
            hivasok = []
        self.hivasok = hivasok

    def orankent_db(self):
        """orankenti hivasok szama"""
        stat = {}
        for hivas in self.hivasok:
            stat[hivas.kezd.o] = stat.get(hivas.kezd.o, 0) + 1
        return stat

    def orankent_db_kkir(self):
        """orankenti hivasok szama kiir"""
        sz = ''
        for ora, db in self.orankent_db().items():
            sz += str(ora) + ' ora ' + str(db) + ' hivas ' + '\n'
        return sz

    def leghosszabb(self):
        """a leghosszabb hivas"""
        legh = self.hivasok[0]
        for hivas in self.hivasok:
            if hivas > legh:
                legh = hivas
        return legh

    def leghosszabb_kiir(self):
        """a leghosszabb hivas"""
        return 'A leghosszabb ideig vonalban lévő hívó ' + str(self.leghosszabb().ssz) + \
               '. sorban szerepel, a hívás hossza: ' + str(self.leghosszabb().hossza()) + ' masodperc.'

    def varakozok_szama(self, idopont):
        """adott idopontban a varakozok szama"""
        var = 0
        hivo_sorszam = None
        for hivas in self.hivasok:

            if hivas.kezd <= idopont <= hivas.vege:

                var += 1
                if not hivo_sorszam:
                    hivo_sorszam = hivas.ssz
                    var -= 1
        return {'vardb': var, 'hivo': hivo_sorszam}

    def varakozok_szama_kiir(self, idopont):
        """adott idopontban a varakozok szama kiir"""
        if self.varakozok_szama(idopont)['vardb']:
            return 'A várakozók száma: ' + str(self.varakozok_szama(idopont)['vardb']) \
                   + ' a beszélő a(z) ' + str(self.varakozok_szama(idopont)['hivo']) + '. hívó.'
        else:
            return 'Nem volt beszélő.'

    def fogadott(self) -> list:
        """fogadott hivasok"""
        fogadott = []  # sorszám, bkezdet, bvég, várakozás
        bkezd = Ido(8, 0, 0)
        bveg = Ido(8, 0, 0)
        varakozas = None
        for hivas in self.hivasok:
            if hivas.vege < Ido(8, 0, 0):  # 8 óra előtt lerakta
                continue
            if hivas.kezd >= Ido(12, 0, 0):  # 12 óra után jött a hívás, nem kell vele törődni
                break
            if hivas.vege <= bveg:  # a hívó letette, mielőtt kapcsolták volna
                continue
            if hivas.kezd < bveg:
                varakozas = (bveg - hivas.kezd).mpbe()
                bkezd = bveg
            else:
                varakozas = 0
                bkezd = hivas.kezd
            bveg = hivas.vege
            fogadott.append([hivas.ssz, bkezd, bveg, varakozas])
        return fogadott

    def utolso(self):
        """az utolso hivo adatai"""
        return self.fogadott()[-1]

    def utolso_kiir(self):
        """az utolso hivo adatai_kiir"""
        return 'Az utolsó telefonalo adatai a(z) ' + str(self.utolso()[0]) + '. sorban található és '\
               + str(self.utolso()[-1]) + ' másodpercet várt.'

    def fogadott_kiir(self):
        sz = ''
        for ssz, bkezd, bveg, varakozas in self.fogadott():
            sz += str(ssz) + ' ' + str(bkezd.o) + ' ' + str(bkezd.p) + ' ' + str(bkezd.mp) \
                  + ' ' + str(bveg.o) + ' ' + str(bveg.p) + ' ' + str(bveg.mp) + '\n'
        return sz


# 2. feladat
fajl = Fajl('hivas.txt')
adatok = fajl.beolvas()
hivasok = Hivasok(adatok)

# 3. feladat
print('3. feladat\n', hivasok.orankent_db_kkir(), sep='')

# 4. feladat
print('4. feladat\n', hivasok.leghosszabb_kiir(), sep='')

# 5. feladat
o, p, mp = input("5. feladat\nAdjon meg egy időpontot! (óra perc másodperc): ").split()
idopont = Ido(int(o), int(p), int(mp))
print(hivasok.varakozok_szama_kiir(idopont))

# 6. feladat
print("6. feladat\n", hivasok.utolso_kiir(), sep='')

# 7. feladat
fajl = Fajl('sikeresOOP.txt')
fajl.kiir(hivasok.fogadott_kiir())
print("7. feladat\nFájlbaírás kész.")
