class Ut:
    def __init__(self, nap, ido, auto, szemely, kmora, kibe):
        self.nap = nap
        self.ido = ido
        self.auto = auto
        self.szemely = szemely
        self.kmora = kmora
        self.kibe = kibe


class Auto:
    def __init__(self, rendszam):
        self.rendszam = rendszam

    def __str__(self):
        return self.rendszam

    def __eq__(self, other):
        return self.rendszam == other.rendszam

    def __ge__(self, other):
        return self.rendszam > other.rendszam

    def __lt__(self, other):
        return self.rendszam < other.rendszam

    def megtettut(self) -> int:
        """az auto altal megtett ut"""
        fajl = Fajl('autok.txt')
        adatok = fajl.beolvas()
        utak = Utak(adatok)
        km = [ut.kmora for ut in utak.utak if ut.auto == self]
        return km[-1] - km[0]

    def menetlevel(self) -> str:
        """menetlevelkiir"""
        fajl = Fajl('autok.txt')
        adatok = fajl.beolvas()
        utak = Utak(adatok)
        sz = ''
        for ut in utak.utak:
            if ut.auto == self:
                if not ut.kibe:
                    sz += str(ut.szemely) + '\t' + str(ut.nap) + '.\t' + str(ut.ido) + '\t' + str(ut.kmora) + ' km\t'
                else:
                    sz += str(ut.nap) + '.\t' + str(ut.ido) + '\t' + str(ut.kmora) + ' km\n'
        return sz


class Utak:
    def __init__(self, utak=None):
        if utak is None:
            utak = []
        self.utak = utak

    def ki(self) -> list:
        """parkolobol kivitt"""
        return [ut for ut in self.utak if not ut.kibe]

    def utolsoki(self) -> Ut:
        """utoljara kivitt auto utja"""
        return self.ki()[-1]

    def utolsoki_kiir(self) -> str:
        """utoljara kivitt auto utja"""
        return str(self.utolsoki().nap) + '. nap rendszám: ' + str(self.utolsoki().auto)

    def forgalom(self, nap) -> list:
        """egy adott naphoz tartozo forgalom"""
        return [ut for ut in self.utak if ut.nap == nap]

    def forgalom_kiir(self, nap) -> str:
        """egy adott naphoz tartozo forgalom"""
        sz = 'Forgalom a(z) ' + str(nap) + '. napon:\n'
        for ut in self.forgalom(nap):
            sz += ut.ido + ' ' + str(ut.auto) + ' ' + str(ut.szemely) + ' ' + ['ki', 'be'][ut.kibe] + '\n'
        return sz

    def kint_db(self) -> int:
        """autok szama, amiket a honap vegen nem hoztak vissza"""
        db = 0
        autok = [ut.auto for ut in self.utak]
        egyedi = []
        for auto in autok:
            if auto not in egyedi:
                egyedi.append(auto)
        for auto in egyedi:
            if autok.count(auto) % 2:
                db += 1
        return db

    def autok_tav(self) -> dict:
        """az autok altal megtett tav"""
        stat = {}
        autok = [ut.auto for ut in self.utak]
        egyedi = []
        for auto in autok:
            if auto not in egyedi:
                egyedi.append(auto)
        for auto in sorted(egyedi):
            km = [ut.kmora for ut in self.utak if ut.auto == auto]
            stat[str(auto)] = km[-1] - km[0]
        return stat

    def autok_tav_kiir(self) -> str:
        """az autok altal megtett tav"""
        sz = ''
        for auto, tav in self.autok_tav().items():
            sz += auto + ' ' + str(tav) + ' km\n'
        return sz

    def szemelyek_tav(self) -> list:
        """szemelyek altal megtett utak"""
        szemelyek = [ut.szemely for ut in self.utak]

        egyedi = []
        maxtavok = []
        for szemely in szemelyek:
            if szemely not in egyedi:
                egyedi.append(szemely)
        for szemely in sorted(egyedi):
            tavolsag = []
            utak = [ut.kmora for ut in self.utak if ut.szemely == szemely]
            if len(utak) % 2 == 1:
                utak.append(utak[-1])  # ha az autó nincs bent, akkor páratlan a lista, az utolsót hozzáadjuk
            for i in range(1, len(utak), 2):
                tavolsag.append(utak[i] - utak[i - 1])  # kigyűjtjük a megtett távolságokat
            maxtavok.append([max(tavolsag), szemely])
        return maxtavok

    def legnagyobb_szemely_tav(self):
        """a legnagyobb tavolsagot megtevo szemely"""
        return max(list(self.szemelyek_tav()))

    def legnagyobb_szemely_tav_kiir(self):
        """a legnagyobb tavolsagot megtevo szemely kiir"""
        legtobb = self.legnagyobb_szemely_tav()
        return 'A leghosszabb út: ' + str(legtobb[0]) + ' km' + ' személy: ' + str(legtobb[1])

    def menetlevel(self, auto):
        """egy autohoz tartozo menetlevel kiir"""
        sz = ''
        for ut in self.utak:
            if ut.auto == auto:
                if not ut.kibe:
                    sz += str(ut.szemely) + '\t' + str(ut.nap) + '.\t' + str(ut.ido) + '\t' + str(ut.kmora) + ' km\t'
                else:
                    sz += str(ut.nap) + '.\t' + str(ut.ido) + '\t' + str(ut.kmora) + ' km\n'
        return sz


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():
            n, i, r, sz, km, kb = sor.split()
            adatok.append(Ut(int(n), i, Auto(r), sz, int(km), int(kb)))

        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()


# 1. feladat
fajl = Fajl('autok.txt')
utak = Utak(fajl.beolvas())

# 2. feladat
print("2. feladat\n", utak.utolsoki_kiir(), sep='')

# 3. feladat
Nap = int(input("3. feladat\nNap: "))
print("4. feladat\n", utak.forgalom_kiir(Nap), sep='')

# 4. feladat
print("4. feladat\nA hónap végén", utak.kint_db(), "autót nem hoztak vissza.")

# 5. feladat
print("5. feladat\n", utak.autok_tav_kiir(), sep='')

# 5. feladat az autok osztalyával
print("5. feladat: az auto osztallyal")
auto = Auto('CEG300')
for i in range(300, 310):
    rendszam = 'CEG' + str(i)
    auto = Auto(rendszam)
    print(rendszam, auto.megtettut(), 'km')

# 6. feladat
print("6. feladat\n", utak.legnagyobb_szemely_tav_kiir(), sep='')

# 7. feladat
auto = Auto(input("7. feladat\nRendszám: "))
fajl = Fajl(str(auto) + '_menetlevelOOP.txt')
fajl.kiir(utak.menetlevel(auto))
print("menetlevél kész.")

# menetlevél az auto osztállyal
auto = Auto(input("7. feladat\nRendszám: "))
fajl = Fajl(str(auto) + '_menetlevelOOP2.txt')
fajl.kiir(auto.menetlevel())
print("menetlevél kész.")
