class Telek:
    def __init__(self, hsz=0, sz=0, h=0):
        self.hsz = hsz
        self.sz = sz
        self.h = h
        self.t = self.sz * self.h

    def beepit(self) -> bool:
        """be kell-e teljesen epiteni"""
        return [False, True][self.sz <= 20]

    def tavolsag(self, other) -> int:
        """ket telek kozotti tavolsag"""
        return abs(other.hsz - self.hsz) // 2 - 1

    def ado(self) -> int:
        """a telek utani ado"""
        if self.t < 700:
            ado = self.t * 51
        elif self.t <= 1000:
            ado = 700 * 51 + (self.t - 700) * 39
        else:
            ado = 700 * 51 + 300 * 39 + 200
        if self.sz < 15 or self.h < 25:
            ado *= 0.8
        ado = int(round(ado / 100, 2)) * 100
        return ado

    def tav(self, telkek) -> int:
        """telek tavolsaga az utca elejetol elejétől"""
        tav = 0
        if self.hsz % 2 == 0:
            kezdo = 2  # páros oldal
        else:
            kezdo = 1  # páratlan oldal
        for hazszam in range(kezdo, self.hsz, 2):
            tav += telkek[hazszam - 1].sz
        return tav

    def szembenvan(self, other, telkek):
        """ket telek szemben van-e"""
        if self.tav(telkek) > other.tav(telkek) + other.sz or self.tav(telkek) + self.sz < other.tav(telkek):
            return False
        else:
            return True


class Fajl:
    """Fajlmuveletek osztalya"""

    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        telkek = []
        f = open(self.fnev)
        db = f.readline()
        for sor in f.readlines():
            hsz, sz, h = sor.split()
            telkek.append(Telek(int(hsz), int(sz), int(h)))
        f.close()
        telkek.sort(key=lambda x: x.hsz)
        return telkek

    def kiir(self, adatok):
        """fajlba iras"""
        f = open(self.fnev, 'w', encoding='utf-8')
        print(adatok, end='', file=f)
        f.close()


class Telkek:
    def __init__(self, tel=None):
        if tel is None:
            tel = []
        self.telkek = tel

    def kerulet(self) -> int:
        """teljes kerulet"""
        return sum(telek.sz for telek in self.telkek) + 2 * 80

    def beepit(self) -> int:
        """a Joletsoron beepitendo  telkek szama"""
        return sum(1 for telek in self.telkek if telek.beepit())

    def legnagyobb_teruletu(self) -> Telek:
        """a legnagyobb teruletu a Gazdasoron"""
        return [telek for telek in self.telkek if
                telek.hsz % 2 and telek.t == max(telek.t for telek in self.telkek if telek.hsz % 2)][0]

    def legkisebb_teruletu(self) -> Telek:
        """legkisebb terulet a gazdasoron"""
        return [telek for telek in self.telkek if
                telek.hsz % 2 and telek.t == min(telek.t for telek in self.telkek if telek.hsz % 2)][0]

    def teruletek_kiir(self) -> str:
        """a legnagyobb es legkisebb teruletu telek adatai a Gazdasoron"""
        return 'A legkisebb teruletű telek házszáma: ' + str(self.legkisebb_teruletu().hsz) + ' területe: ' + str(
            self.legkisebb_teruletu().t) + '\n' + 'A legnagyobb teruletü telek házszáma: ' + str(
            self.legnagyobb_teruletu().hsz) + ' területe: ' + str(
            self.legnagyobb_teruletu().t) + '\n' + 'A két telek között elhelyezkedő telkek száma: ' + str(
            self.legkisebb_teruletu().tavolsag(self.legnagyobb_teruletu()))

    def adobevetel(self) -> int:
        """adobevetel a Gazdasoron"""
        return sum(telek.ado() for telek in self.telkek if telek.hsz % 2)

    def haromutolso(self) -> list:
        """harom utolso telek a Joletsoron"""
        return [telek for telek in self.telkek if telek.hsz % 2 == 0][-3:]

    def haromutolso_kiir(self) -> str:
        """harom utolso telek a Joletsoron"""
        sz = 'Házszám\tTávolság\n'
        for telek in sorted(self.haromutolso(), key=lambda x: x.hsz, reverse=True):
            sz += str(telek.hsz) + '\t' + str(telek.tav(self.telkek)) + ' méter\n'
        return sz

    def telekhosszak(self) -> list:
        """a Joletsoron levo telkek hossza"""
        telkek0 = [telek for telek in self.telkek if not telek.hsz % 2]  # páros oldal telkei
        telkek1 = [telek for telek in self.telkek if telek.hsz % 2]
        for t0 in telkek0:
            hossz = 70
            for t1 in telkek1:
                if t0.szembenvan(t1, self.telkek) and 70 - t1.h < hossz:
                    hossz = 70 - t1.h
                    t0.h = hossz
        return telkek0

    def telekhossz_kiir(self) -> str:
        """a Joletsoron levo telkek hossza kiir"""
        sz = ''
        for telek in self.telekhosszak():
            sz += str(telek.hsz) + ';' + str(telek.sz) + ';' + str(telek.h) + '\n'
        return sz

    def telekhosszak2(self) -> list:
        """a Joletsoron levo telkek hossza"""
        # eredeti adatok módosításával
        for t0 in self.telkek:
            if not t0.hsz % 2:
                hossz = 70
                for t1 in self.telkek:
                    if t1.hsz % 2:
                        if t0.szembenvan(t1, self.telkek) and 70 - t1.h < hossz:
                            hossz = 70 - t1.h
                            t0.h = hossz
        return self.telkek

    def telekhossz_kiir2(self) -> str:
        """a Joletsoron levo telkek hossza kiir"""
        sz = ''
        for telek in self.telekhosszak2():
            if not telek.hsz % 2:  # csak a páros oldal
                sz += str(telek.hsz) + ';' + str(telek.sz) + ';' + str(telek.h) + '\n'
        return sz


# 1. feladat
fajl = Fajl('telkek.txt')
telkek = Telkek(fajl.beolvas())

# 2. feladat
print("2. feladat\nÖsszesen", telkek.kerulet(), "métert kell gyalogolni.")

# 3. feladat
print("3. feladat\nA keskeny telkek száma a Jólétsoron: ", telkek.beepit())

# 4. feladat
print("4. feladat\n", telkek.teruletek_kiir(), sep='')

# 5. feladat
print("5. feladat\nAdóbevétel a Gazdasoron:", telkek.adobevetel(), "fabatka volt.")

# 6. feladat
print("6. feladat\nAz utolsó három telek a Jólétsoron:\n", telkek.haromutolso_kiir(), sep='')

# 7. feladat
fajl = Fajl('joletsorOOP.csv')
fajl.kiir(telkek.telekhossz_kiir2())
print("7. feladat\nFájlbaírás kész.")
