class Utas:
    def __init__(self, m, d, i, a, t, e):
        self.megallo = m
        self.datum = d
        self.ido = i
        self.azon = a
        self.tipus = t
        self.erv = e

    def ervenyes(self):
        """ervenyes-e a jegy vagy berlet"""

        if (self.tipus == 'JGY' and self.erv == Datum('0')) or (self.tipus != 'JGY' and self.datum > self.erv):
            return False
        else:
            return True

    def kedvezmenyes(self):
        """kedvezmenyes berlet"""
        kedv_b = ['TAB', 'NYB']
        return [False, True][self.tipus in kedv_b]

    def ingyenes(self):
        """ingyenes berlet"""
        ingy_b = ['NYP', 'RVS', 'GYK']
        return [False, True][self.tipus in ingy_b]

    def le_fog_jarni(self):
        """ervenyessegi ido miatt lejarhat"""
        if self.tipus != 'JGY' and (self.erv > self.datum or self.erv == self.datum):
            if self.datum.napokszama(self.erv) <= 3:
                return True
        return False



class Utazasok:
    def __init__(self, utasok=None):
        if utasok is None:
            utasok = []
        self.utasok = utasok

    def utasok_szama(self):
        """utasok szama"""
        return len(self.utasok)

    def ervenytelen_db(self):
        """ervenytelen jeggyel vagy berlettel rendelkezok szama"""
        return len([utas for utas in self.utasok if not utas.ervenyes()])

    def felszallo_utasok_db(self):
        """megallokban felszallo utasok szama"""
        m = [0] * 30
        for utas in self.utasok:
            m[utas.megallo] += 1
        return m

    def legtobb_utas_megallo(self):
        """a legtobb felszallo utas megalloja es szama"""
        legtobb = max(self.felszallo_utasok_db())
        megallo = self.felszallo_utasok_db().index(legtobb)
        return {'megallo': megallo, 'db': legtobb}

    def kedvezmenyesek_szama(self):
        """kedvezmennyel rendelkezok szama"""
        kedv = len([utas for utas in self.utasok if utas.kedvezmenyes() and utas.ervenyes()])
        ingy = len([utas for utas in self.utasok if utas.ingyenes() and utas.ervenyes()])
        return {'kedv': kedv, 'ingy': ingy}

    def figyelmeztetes(self):
        """akiknek lejar a berlete"""
        return [utas for utas in self.utasok if utas.le_fog_jarni()]

    def figyelmeztetes_kiir(self):
        sz = ''
        for utas in self.figyelmeztetes():
            sz += utas.azon + ' ' + utas.erv.kiir() + '\n'
        return sz


class Datum:
    def __init__(self, datum):
        self.e = datum[:4]
        self.h = datum[4:6]
        self.n = datum[6:]

    def kiir(self):
        return self.e + '-' + self.h + '-' + self.n

    def __eq__(self, other):
        """datumok egyenlosege"""
        if self.e + self.h + self.n == other.e + other.h + other.n:
            return True
        return False

    def __gt__(self, other):
        """nagyobb, mint a masik"""
        if self.e + self.h + self.n > other.e + other.h + other.n:
            return True
        return False

    def napokszama(self, masik):
        """ket datum kozotti napok szama"""
        e1, h1, n1 = int(self.e), int(self.h), int(self.n)
        e2, h2, n2 = int(masik.e), int(masik.h), int(masik.n)
        h1 = (h1 + 9) % 12
        e1 = e1 - h1 // 10
        d1 = 365 * e1 + (e1 // 4) - (e1 // 100) + (e1 // 400) + ((h1 * 306 + 5) // 10) + n1 - 1
        h2 = (h2 + 9) % 12
        e2 = e2 - (h2 // 10)
        d2 = 365 * e2 + (e2 // 4) - (e2 // 100) + (e2 // 400) + ((h2 * 306 + 5) // 10) + n2 - 1
        return d2 - d1


class Fajl:
    """Fajlmuveletek osztalya"""

    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        f = open(self.fnev)
        utasok = []
        for sor in f:
            m, d, a, t, e = sor.split()
            m = int(m)
            d, i = d.split("-")
            # if e != '0':
            e = Datum(e)
            utasok.append(Utas(m, Datum(d), i, a, t, e))
        return utasok

    def kiir(self, adatok):
        """fajlba iras"""
        f = open(self.fnev, 'w', encoding='utf-8')
        print(adatok, end='', file=f)
        f.close()


# 1. feladat
fajl = Fajl('utasadat.txt')
utasok = fajl.beolvas()
utazasok = Utazasok(utasok)

# 2. feladat
print("2. feladat:\nA buszra", utazasok.utasok_szama(), "utas akart felszállni.")

# 3. feladat
print("3. feladat:\nA buszra", utazasok.ervenytelen_db(), "utas nem szállhatott fel.")

# 4. feladat
print("4. feladat:\nA legtöbb utas (", utazasok.legtobb_utas_megallo()['db'], " fő) a ",
      utazasok.legtobb_utas_megallo()['megallo'], ". megállóban próbált felszállni.", sep='')

# 5. feladat
print("5. feladat:\nIngyenesen utazók száma:", utazasok.kedvezmenyesek_szama()['kedv'],
      " fő\nA kedvezményesen utazók száma:", utazasok.kedvezmenyesek_szama()['ingy'], "fő")

# 7. feladat
fajl = Fajl('figyelmeztetesOOP.txt')
fajl.kiir(utazasok.figyelmeztetes_kiir())
print("Fájlbaírás kész.")
