class Ido:
    def __init__(self, p=0, mp=0):
        omp = p * 60 + mp
        self.o = omp // 3600
        self.p = (omp - self.o * 3600) // 60
        self.mp = omp % 60

    def __str__(self):
        return '{:02d}'.format(self.o) + ':' + '{:02d}'.format(self.p) + ':' + '{:02d}'.format(self.mp)

    def mpbe(self) -> float:
        """masodpercbe"""
        return self.o * 3600 + self.p * 60 + self.mp

    def __sub__(self, other):
        return Ido(0, abs(other.mpbe() - self.mpbe()))

    def __add__(self, other):
        return Ido(0, other.mpbe() + self.mpbe())

    def __gt__(self, other):
        """nagyobb operator"""
        if self.mpbe() >= other.mpbe():
            return True
        return False

    def __le__(self, other):
        """nagyobb operator"""
        if self.mpbe() <= other.mpbe():
            return True
        return False


class Zene:
    def __init__(self, ado, ido, eloado, cim):
        self.ado = ado
        self.ido = ido
        self.eloado = eloado
        self.cim = cim


class Fajl:
    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        f = open(self.fnev)
        db = int(f.readline())
        zenek = []
        for sor in f:
            x = sor.split(" ", 3)
            ado = int(x[0])
            perc = int(x[1])
            mperc = int(x[2])
            dal = x[3].split(':')
            eloado = dal[0]
            cim = dal[1].strip()
            zenek.append(Zene(ado, Ido(perc, mperc), eloado, cim))
        f.close()
        return zenek

    def kiir(self, adatok):
        """fajlba iras"""
        f = open(self.fnev, 'w')
        print(adatok, end='', file=f)
        f.close()


class Zenek:
    def __init__(self, zenek=None):
        if zenek is None:
            zenek = []
        self.zenek = zenek

    def adok_db(self) -> dict:
        """az egyes adokot jatszott dalok szama"""
        dalok = {}
        for dal in self.zenek:
            dalok[dal.ado] = dalok.get(dal.ado, 0) + 1
        return dalok

    def adok_db_kiir(self) -> str:
        """az egyes adokot jatszott dalok szama kiir"""
        sz = ''
        for ado, db in self.adok_db().items():
            sz += 'A(z) ' + str(ado) + '. csatornán ' + str(db) + ' dalt játszottak.\n'
        return sz

    def eric(self) -> Ido:
        """az elso es utolso Eric Clapton dal kozott eltelt ido az 1-es adon"""
        dalok1 = [zene for zene in self.zenek if zene.ado == 1]
        ido1, ido2, ido = Ido(0, 0), Ido(0, 0), Ido(0, 0)
        for i in range(len(dalok1)):
            if dalok1[i].eloado == 'Eric Clapton':
                break
            else:
                ido1 += dalok1[i].ido
        for i in range(len(dalok1), -1):
            ido2 += dalok1[i].ido
            if dalok1[i].eloado == 'Eric Clapton':
                break
        for i in range(len(dalok1)):
            ido += dalok1[i].ido
        return ido - ido1 - ido2

    def dal_keres(self, eloado, cim) -> Zene:
        """eloado, cim szerinti kereses"""
        keresett = None
        for dal in self.zenek:
            if dal.eloado == eloado and dal.cim == cim:
                keresett = dal
                break
        return keresett

    def kezdes_ido(self, zene) -> Ido:
        """egy dal kezdesi ideje"""
        kezd = Ido(0, 0)
        for dal in self.zenek:
            if dal == zene:
                break
            if dal.ado == zene.ado:
                kezd += dal.ido
        return kezd

    def masikdal(self, zene) -> list:
        """a masik ket csatornan hallhato dalok"""
        masik = []
        idopont = self.kezdes_ido(zene)
        for dal in self.zenek:
            if dal.ado != zene.ado and self.kezdes_ido(dal) < idopont < self.kezdes_ido(dal) + dal.ido:
                masik.append(dal)
        return masik

    def masikdal_kiir(self, zene) -> str:
        """a masik ket csatornan hallhato dalok"""
        sz = 'A(z) ' + zene.eloado + ':' + zene.cim + ' dal a(z) ' + str(zene.ado) + '. csatornán volt hallható.\n'
        sz += 'Ekkor a másik két adón hallható dal:\n'
        for dal in self.masikdal(zene):
            sz += 'A(z) ' + str(dal.ado) + '. csatornán hallható dal ' + dal.eloado + ':' + dal.cim + ' volt.\n'
        return sz

    def masik_dal_omega(self) -> str:
        """a masik ket csatornan hallhato dalok az Omegaval egyidoben"""
        zene = self.dal_keres('Omega', 'Legenda')
        return self.masikdal_kiir(zene)

    def zene_keres(self, karaktersorozat) -> list:
        """karaktersorozatot tartalmazo zenek azonositojanak keresese"""
        return [index + 1 for index, zene in enumerate(self.zenek) if
                karaktersorozat in (zene.eloado + ' ' + zene.cim).upper()]

    def zene_keres_kiir(self, karaktersorozat) -> str:
        """karaktersorozatot tartalmazo zenek azonositojanak keresese kiir"""
        sz = karaktersorozat + '\n'
        for ssz in self.zene_keres(karaktersorozat):
            sz += str(ssz) + '\n'
        return sz

    def eredeti_vege_1(self):
        """az 1-es csatornán az adás eredeti vége"""
        ido = Ido(0, 0)
        for zene in self.zenek:
            if zene.ado == 1:
                ido += zene.ido
        return ido

    def adas_vege_1(self):
        """az adas vege az eredeti csatornan"""
        idok = [zene.ido for zene in self.zenek if zene.ado == 1]
        osszido = Ido(0, 0)
        ora = Ido(60, 0)
        for i in idok:
            if osszido + i + Ido(0, 60) >= ora:  # ha a zene a bevezetővel együtt nem végződik a hírekig
                osszido = ora + Ido(0, 180) - Ido(0, 60)
                ora += Ido(60, 0)

            osszido += Ido(0, 60) + i
        return osszido


# 1. feladat
fajl = Fajl('musor.txt')
adatok = fajl.beolvas()
zenek = Zenek(adatok)

# 2. feladat
print("2. feladat\n", zenek.adok_db_kiir(), sep='')

# 3. feladat
print("3. feladat\nAz első és utolsó Eric Clapton dal között eltelt idő: ", zenek.eric())

# 4. feladat
print("4. feladat\n", zenek.masik_dal_omega(), sep='')

# 5. feladat
karakterek = input("5. feladat: adjon meg egy karaktersorozatot: ").upper()
fajl = Fajl('keresOOP.txt')
fajl.kiir(zenek.zene_keres_kiir(karakterek))
print("Fájlbaírás kész.")

# 6. feladat
print("6. feladat\nAz adás eredeti vége az 1-es csatornán:", zenek.eredeti_vege_1())
print("Az adás vége az 1-es csatornán:", zenek.adas_vege_1())
