class Amino:
    def __init__(self, rov='', jel='', c=0, h=0, o=0, n=0, s=0):
        self.rov = rov
        self.jel = jel
        self.c = int(c)
        self.h = int(h)
        self.o = int(o)
        self.n = int(n)
        self.s = int(s)

    # 2. feladat
    def tomege(self):
        return self.c * 12 + self.h * 1 + self.o * 16 + self.n * 14 + self.s * 32


class Aminosavak:
    def __init__(self, aminok=None):
        if aminok is None:
            aminok = []
        self.aminok = aminok

    def novekvo(self) -> list:
        """molekulatomeg szerint novekvo sorrend"""
        return sorted(self.aminok, key=lambda x: x.tomege())

    def novekvo_kiir(self) -> str:
        """molekulatomeg szerint novekvo sorrend kiir"""
        sz = ''
        for aminio in self.novekvo():
            sz += aminio.rov + ' ' + str(aminio.tomege()) + '\n'
        return sz

    def keres(self, jel) -> Amino:
        """amino kresese jele alapjan"""
        ami = None
        for amino in self.aminok:
            if amino.jel == jel:
                ami = amino
                break
        return ami


class Fajl:
    """Fajlmuveletek osztalya"""

    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        adatok = []
        f = open(self.fnev)
        i = 0
        ami = None
        for x in f.readlines():
            if i % 7 == 0:
                ami = Amino()
                adatok.append(ami)
                ami.rov = x.strip()
            elif i % 7 == 1:
                ami.jel = x.strip()
            elif i % 7 == 2:
                ami.c = int(x)
            elif i % 7 == 3:
                ami.h = int(x)
            elif i % 7 == 4:
                ami.o = int(x)
            elif i % 7 == 5:
                ami.n = int(x)
            else:
                ami.s = int(x)
            i += 1
        f.close()

        return adatok

    def beolvas2(self):
        """fajl adatainak beolvasasa"""
        # feherje beolvasahoz
        f = open(self.fnev)
        adatok = [x.strip() for x in f.readlines()]
        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 Feherje:
    file = Fajl('aminosav.txt')
    adatok = file.beolvas()
    aminok = Aminosavak(adatok)

    def __init__(self, nev, aminosavak=None):
        if aminosavak is None:
            aminosavak = []
        self.nev = nev
        self.aminosavak = aminosavak

    def osszegkeplet(self) -> dict:
        """feherje osszegkeplete"""
        db = {'C': 0, 'H': 0, 'O': 0, 'N': 0, 'S': 0}
        kotesek = 0
        for jel in self.aminosavak:
            amin = aminok.keres(jel)  # az aminosav megkeresese az aminosavak kozott
            db['C'] += amin.c
            db['H'] += amin.h
            db['O'] += amin.o
            db['N'] += amin.n
            db['S'] += amin.s
            kotesek += 1
        db['O'] -= kotesek
        db['H'] += 2 * kotesek
        return db

    def osszegkeplet_kiir(self) -> str:
        """feherje osszegkeplete kiir"""
        sz = ''
        for k, db in self.osszegkeplet().items():
            sz += k + ' ' + str(db) + ' '
        return sz

    def leghosszabb_darab(self) -> dict:
        """feherje leghosszabb darabja"""
        szamlalo = 1
        index = 1
        hossz = 0
        i = 0
        for c in self.aminosavak:
            if c in ['Y', 'W', 'F']:
                if szamlalo > hossz:
                    hossz = szamlalo
                    index = i
                szamlalo = 1
            i += 1
            szamlalo += 1
        return {'hossz': hossz, 'kezdet': index + 2 - hossz, 'vége': index + 1}

    def leghosszabb_darab_kiir(self) -> str:
        """feherje leghosszabb darabja kiir"""
        return 'A BSA lánc leghosszabb sarabja: ' + str(self.leghosszabb_darab()['hossz']) + \
               ' a kezdet helye: ' + str(self.leghosszabb_darab()['kezdet']) + \
               ' a vége helye: ' + str(self.leghosszabb_darab()['vége'])

    def ciszterinszam(self) -> int:
        """ciszterinek szama az elso darabban"""
        C = 0
        for i in range(len(self.aminosavak) - 1):
            if self.aminosavak[i] == 'R' and (self.aminosavak[i + 1] == 'A' or self.aminosavak[i + 1] == 'V'):
                break
            if self.aminosavak[i] == 'C':
                C += 1
        return C


# 1. feladat
file = Fajl('aminosav.txt')
adatok = file.beolvas()
aminok = Aminosavak(adatok)

# 3. feladat
print("3. feladat\n", aminok.novekvo_kiir(), sep='')
file = Fajl('eredmenyOOP.txt')
file.kiir(aminok.novekvo_kiir())
print("Fájlbaírás kész.")

# 4. feladat
file = Fajl('bsa.txt')
adatok = file.beolvas2()
feherje = Feherje('BSA', adatok)
print(feherje.osszegkeplet_kiir())

# 5. feladat
print("5. feladat\n", feherje.leghosszabb_darab_kiir(), sep='')

# 6. feladat
print("6. feladat\nAz első fehérjelánc részletben", feherje.ciszterinszam(), "darab Ciszterin (C) található.")
