class Jelolt:
    """egy szavazat osztalya"""

    def __init__(self, ker, szav, nev, part):
        self.ker = ker
        self.szav = szav
        self.nev = nev
        self.part = part


class Part:
    """part osztalya"""
    partok = {'GYEP': 'Gyümölcsevők pártja', 'HEP': 'Húsevők pártja', 'TISZ': 'Tejívók szövetsége',
              'ZEP': 'Zöldségevők Pátja',
              '-': 'Független jelöltek'}

    def __init__(self, rov):
        self.rov = rov
        self.nev = self.partok[self.rov]


class Fajl:
    """Fajlmuveletek osztalya"""

    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        adatok = []
        f = open(self.fnev)
        for sor in f.readlines():
            sorszam, szavazat, veznev, utonev, part = sor.split()
            adatok.append(Jelolt(int(sorszam), int(szavazat), veznev + " " + utonev, Part(part)))
        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 Szavazatok:
    """szavazatok osztalya"""
    ossz = 12345

    def __init__(self, szavazatok=None):
        if szavazatok is None:
            szavazatok = []
        self.szavazatok = szavazatok
        self.db = len(self.szavazatok)

    def kepviselo_szavazat(self, nev) -> int:
        """egy kepviselore leadott szavazatok szama"""
        return sum(kep.szav for kep in self.szavazatok if kep.nev == nev)

    def kepviselo_szavazat_kiir(self, nev) -> str:
        """egy kepviselore leadott szavazatok szama kiir"""
        if self.kepviselo_szavazat(nev):
            return 'A képviselőre leadott szavazatok száma: ' + str(self.kepviselo_szavazat(nev))
        else:
            return 'Ilyen nevű képviselőjelölt nem szerepel a nyilvántartásban!'

    def osszszavazat(self) -> int:
        """a leadott szavazatok száma"""
        return sum(kep.szav for kep in self.szavazatok)

    def reszveteli_arany(self) -> float:
        """a reszveteli arany %-ban"""
        return round(self.osszszavazat() * 100 / self.ossz, 2)

    def szavazatszam(self) -> dict:
        """partokra leadott szavazatszam"""
        szav = {}
        for szavazat in self.szavazatok:
            szav[szavazat.part.rov] = szav.get(szavazat.part.rov, 0) + szavazat.szav
        return szav

    def szavazatarany(self) -> dict:
        """partokra leadott szavazatszam aranya"""
        szav = {}
        for part, db in self.szavazatszam().items():
            szav[part] = round(db * 100 / self.osszszavazat(), 2)
        return szav

    def szavazat_arany_kiir(self) -> str:
        """partokra leadott szavazatszam aranya kiir"""
        sz = ''
        for rov, arany in self.szavazatarany().items():
            sz += Part(rov).nev + ' = ' + str(arany) + '%\n'
        return sz

    def legtobb_szavazat(self) -> int:
        """legtobb szavazat"""
        return max(szavazat.szav for szavazat in self.szavazatok)

    def legtobb_szavazat_jeloletek(self) -> list:
        """a legtobb szavazattal rendelkezo szavazasok"""
        return [szavazat for szavazat in self.szavazatok if szavazat.szav == self.legtobb_szavazat()]

    def legtobb_szavazat_jeloletek_kkir(self) -> str:
        """a legtobb szavazattal rendelkezo szavazasok"""
        sz = ''
        for szavazat in self.legtobb_szavazat_jeloletek():
            if szavazat.part.rov == '-':
                szavazat.part.rov = 'független'
            sz += szavazat.nev + ' ' + szavazat.part.rov + '\n'
        return sz

    def gyoztesek(self) -> dict:
        """gyoztesek keruletenkent"""
        gy = {}
        for ker in range(1, 9):
            legtobb = 0
            gyoztes = None
            for jelolt in self.szavazatok:
                if ker == jelolt.ker and jelolt.szav > legtobb:
                    legtobb = jelolt.szav
                    gyoztes = jelolt
            gy[ker] = gyoztes
        return gy

    def gyoztesek_kkir(self) -> str:
        """gyoztesek keruletenkent"""
        sz = ''
        for ker, gyoz in self.gyoztesek().items():
            if gyoz.part.rov == '-':
                gyoz.part.rov = 'független'
            sz += str(ker) + ' ' + gyoz.nev + ' ' + gyoz.part.rov + '\n'
        return sz


# 1. feladat
fajl = Fajl('szavazatok.txt')
szavazas = Szavazatok(fajl.beolvas())

# 2. feladat
print("2. feladat\nA helyhatósági választásokon", szavazas.db, "képviselőjelölt indult.")

# 3. feladat
kepviselo = input("3. feladat\nAdjál meg egy nevet: ")
print(szavazas.kepviselo_szavazat_kiir(kepviselo))

# 4. feladat
print("4. feladat\nA választáson", szavazas.osszszavazat(), "állampolgár, a jogosultak ",
      szavazas.reszveteli_arany(), "%-a vett részt.")

# 5. feladat
print("5. feladat\nAz egyes pártokra leadott szavazatok aránya:")
print(szavazas.szavazat_arany_kiir())

# 6. feladat
print("6. feladat\nA legtöbb szavazatot kapók:")
print(szavazas.legtobb_szavazat_jeloletek_kkir())

# 7. feladat
fajl = Fajl('kepviselokOOP.txt')
fajl.kiir(szavazas.gyoztesek_kkir())
print("7. feladaz\nA fájlbaírás kész.")
