class Eloadas:
    def __init__(self, nev, honap, nap, ssz, ido, cim, egyeb):
        self.nev = nev
        self.honap = honap
        self.nap = nap
        self.ssz = ssz
        self.ido = ido
        self.cim = cim
        self.egyeb = egyeb


class Ido:
    def __init__(self, ora=0, perc=0):
        osszp = ora * 60 + perc
        self.ora = osszp // 60
        self.perc = osszp % 60

    def percbe(self) -> int:
        """ido percben"""
        return self.ora * 60 + self.perc

    def __str__(self):
        return '{}:{:02d}'.format(self.ora, self.perc)

    def __add__(self, other):
        return Ido(0, self.percbe() + other.percbe())

    def __eq__(self, other):
        return self.percbe() == other.percbe()

    def __gt__(self, other):
        return self.percbe() > other.percbe()

    def __ge__(self, other):
        return self.percbe() >= other.percbe()


class Fajl:
    """Fajlmuveletek osztalya"""

    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        adatok = []
        f = open(self.fnev, encoding='utf-8')

        for sor in f.readlines():
            nev, honap, nap, ssz, ido, cim, egyeb = sor.strip().split('\t')
            adatok.append(Eloadas(nev, honap, int(nap), int(ssz), Ido(0, int(ido)), cim, egyeb))

        f.close()
        return adatok

    def kiir(self, adatok):
        """fajlba iras"""
        f = open(self.fnev, 'w', encoding='utf-8')
        print(adatok, end='', file=f)
        f.close()


class Kongresszus:
    def __init__(self, eloadasok=None):
        if eloadasok is None:
            eloadasok = []
        self.eloadasok = eloadasok

    def napibontas(self):
        """eloadasok napi bontasban kiir"""
        sz = ''
        self.eloadasok.sort(key=lambda x: x.nap * 100 + x.ssz)
        for n in range(5, 9):
            sz += 'november ' + str(n) + '.:' + '\n'
            for eloadas in self.eloadasok:
                if eloadas.nap == n:
                    sz += '   {}. {}: {}\n'.format(eloadas.ssz, eloadas.nev, eloadas.cim)
        return sz

    def eloadasok_osszideje(self) -> dict:
        """eloadasok osszideje naponkent"""
        idok = {}
        for eloadas in self.eloadasok:
            idok[eloadas.nap] = idok.get(eloadas.nap, Ido(0, 0)) + eloadas.ido
        return idok

    def eloadasok_osszideje_kiir(self) -> str:
        """eloadasok osszideje naponkent_kiir"""
        sz = ''
        for nap, ido in self.eloadasok_osszideje().items():
            sz += str(nap - 4) + '. nap ' + str(ido) + '\n'
        return sz

    def leghosszabb(self, nap=6) -> int:
        """leghosszabb eloadas ideje"""
        legh = Ido(0, 0)
        for eloadas in self.eloadasok:
            if eloadas.nap == nap:
                if eloadas.ido > legh:
                    legh = eloadas.ido
        return legh

    def leghosszabb_eloadasok(self, nap=6) -> list:
        """leghosszabb eloadas ideje"""
        return [eloadas for eloadas in self.eloadasok if eloadas.ido == self.leghosszabb(nap) and eloadas.nap == nap]

    def leghosszabb_eloadasok_kiir(self, nap=6) -> str:
        """leghosszabb eloadas ideje kiir"""
        sz = ''
        for eloadas in self.leghosszabb_eloadasok(nap):
            sz += eloadas.nev + ' - ' + str(eloadas.ido.percbe()) + ' perc\n'
        return sz

    def eloadasok_vege(self) -> dict:
        """az eloadasok vege naponkent"""
        idok = {}
        for n in range(5, 9):
            ossz = Ido(0, 8 * 60)  # 8 órakor indul
            for eloadas in self.eloadasok:
                if eloadas.nap == n:
                    ossz += eloadas.ido + Ido(0, 20)
            if ossz >= Ido(0, 12 * 60):  # ha átnyúlik a délutánra
                ossz += Ido(0, 60)  # egy óra ebédszünet
            idok[n] = ossz
        return idok

    def eloadasok_vege_kiir(self) -> str:
        """az eloadasok vege naponkent"""
        sz = ''
        for nap, ido in self.eloadasok_vege().items():
            sz += str(nap) + '. nap - ' + str(ido) + '\n'
        return sz

    def ebedido(self, nap=7) -> Ido:
        """ebedido kezdete a harmadik napon"""
        ossz = Ido(0, 8 * 60)
        for eloadas in self.eloadasok:
            if eloadas.nap == nap:
                ossz += eloadas.ido + Ido(0, 20)
            if ossz >= Ido(0, 12 * 60):
                break
        return ossz

    def egyezok(self) -> dict:
        """egyezo nevek"""
        stat = {}
        nevek = [eloadas.nev for eloadas in self.eloadasok]
        for nev in set(nevek):
            if nevek.count(nev) > 1:
                stat[nev] = nevek.count(nev)
        return stat

    def egyezok_kiir(self) -> str:
        """egyezo nevek kiir"""
        if len(self.egyezok()) == 0:
            sz = 'Nincsenek egyező nevek.'
        else:
            sz = ''
            for nev, db in self.egyezok().items():
                sz += nev + ' ' + str(db) + '\n'
        return sz

    def esemeny(self, nap, ido):
        """adott napon, adott idoben levo esemeny"""
        sz = ''
        ossz = Ido(8, 0)
        i = 0
        ebedelott = True
        if ossz > ido:
            print("Még nem kezdődött el.")
        while ido >= ossz and i < len(self.eloadasok):

            if self.eloadasok[i].nap == nap:
                ossz += self.eloadasok[i].ido
                if ossz >= ido:
                    sz = 'Az adott időpontban előadás van.'
                else:
                    ossz += Ido(0, 20)
                    if ossz >= ido:
                        sz = 'Az adott időpontban vita van.'
                    elif ebedelott and ossz >= Ido(12, 0):
                        ossz += Ido(1, 0)
                        ebedelott = False
                        if ossz > ido:
                            sz = 'Az adott időpontban ebédszünet van.'
            i += 1
        if ido > ossz:
            sz = 'A program véget ért.'
        return sz

    def idorend(self) -> str:
        """idorend"""
        sz = ''
        for n in range(5, 9):
            ebedelott = True
            ossz = Ido(8, 0)  # 8 órakor indul
            sz += 'november ' + str(n) + '. ' + '\n'
            for eloadas in self.eloadasok:
                if eloadas.nap == n:
                    sz += str(ossz) + '-'
                    ossz += eloadas.ido
                    sz += str(ossz) + ' ' + eloadas.nev + ': ' + eloadas.cim + ' (' + eloadas.egyeb + ')\n'

                    sz += str(ossz) + '-' + str(ossz + Ido(0, 20)) + ' Vita\n'
                    ossz += Ido(0, 20)
                    if ebedelott and ossz >= Ido(12, 0):
                        sz += str(ossz) + '-' + str(ossz + Ido(1, 0)) + ' Ebéd\n'
                        ossz += Ido(1, 0)
                        ebedelott = False
        return sz



# 1. feladat
fajl = Fajl('eloadasok.txt')
kongresszus = Kongresszus(fajl.beolvas())

# 2. feladat
print("2. feladat\n", kongresszus.napibontas(), sep='')

# 3. feladat
print("3. feladat\n", kongresszus.eloadasok_osszideje_kiir(), sep='')

# 4. feladat
print("4. feladat\nA leghosszabb előadást tartók november 6-án:\n", kongresszus.leghosszabb_eloadasok_kiir(), sep='')

# 5. feladat
print("5. feladat\nAz előadások vége:\n", kongresszus.eloadasok_vege_kiir(), sep='')

# 6. feladat
print("6. feladat\nAz ebédidő kezdete a harmadik napon:", kongresszus.ebedido())

# 7. feladat
print("7. feladat\n", kongresszus.egyezok_kiir(), sep='')

# 8. feladat
egynap = int(input("8. feladat\nAdjál meg egy napot (5-8): "))
egyora = int(input("Add meg az órát (0-24): "))
egyperc = int(input("Add meg a percet (0-59): "))
print(kongresszus.esemeny(egynap, Ido(egyora, egyperc)))

# 9. feladat
fajl = Fajl('idorendOOP.txt')
fajl.kiir(kongresszus.idorend())
print("9. feladat\nFájlbaírás kész.")
