import random


class Kod:
    def __init__(self, ssz=0, kod=''):
        self.ssz = ssz
        self.kod = kod
        self.hossz = len(self.kod)

    def __eq__(self, other):
        return [False, True][self.kod == other.kod]

    def ismetlodes(self) -> bool:
        """van-e a szamjegyek kozott ismetlodes"""
        return [False, True][len(self.kod) != len(set(self.kod))]

    def veletlenkod(self):
        """a kod hosszaval egyezo ismetlodes nelkuli kod"""
        veletlenkod = str(random.randrange(10))
        i = 0
        while len(veletlenkod) != self.hossz:
            karakter = str(random.randrange(10))
            if karakter not in veletlenkod:
                veletlenkod += karakter
            i += 1
        return Kod(0, veletlenkod)

    # 6. feladat
    def nyit(self, proba) -> bool:
        """ket kodrol eldonti, hogy ugyanazt nyitja-e"""
        egyezik = (self.hossz == proba.hossz)
        if egyezik:
            elteres = ord(self.kod[0]) - ord(proba.kod[0])
            for i in range(1, self.hossz):
                if (elteres - (ord(self.kod[i]) - ord(proba.kod[i]))) % 10 != 0:
                    egyezik = False
        return egyezik


class Kodok:
    def __init__(self, kodok=None):
        if kodok is None:
            kodok = []
        self.kodok = kodok

    def azonosak(self, egykod) -> list:
        """azonos koddal egyezo kodok"""
        return [kod for kod in self.kodok if kod == egykod]

    def azonosak_kiir(self, egykod) -> str:
        """azonos koddal egyezo kodok sorszama kiir"""
        sz = ''
        for kod in self.azonosak(egykod):
            sz += str(kod.ssz) + ' '
        sz += '\n'
        return sz

    def ismetlodeses_kodok(self) -> list:
        """azok a kodok, amelyekben ismetlodo szamjegy"""
        return [kod for kod in self.kodok if kod.ismetlodes()]

    def ismetlodeses_kodok_kkir(self) -> str:
        """azok a kodok, amelyekben ismetlodo szamjegy"""
        sz = ''
        if not len(self.ismetlodeses_kodok()):
            return 'Nem volt ismetlodes'
        else:
            return min(self.ismetlodeses_kodok(), key=lambda x: x.ssz).ssz

    def siker_kiir(self, proba) -> str:
        """nyitasi probalkozasok ertekelese kiir"""
        sz = ''
        for kod in self.kodok:
            if kod.hossz != proba.hossz:
                sz += kod.kod + ' hibas hossz\n'
            elif kod.nyit(proba):
                sz += kod.kod + ' sikeres\n'
            else:
                sz += kod.kod + ' hibás kód\n'
        return sz


class Fajl:
    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        f = open(self.fnev, encoding='utf-8')
        i = 1
        kodok = []
        for x in f.readlines():
            kodok.append(Kod(i, x.strip()))
            i += 1
        f.close()
        return kodok

    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('ajto.txt')
adatok = fajl.beolvas()
kodok = Kodok(adatok)

# 2. feladat
egykod = input("2. feladat\nAdja meg, mi nyitja a zárat! ")
egykod = Kod(0, egykod)

# 3. feladat
print("3. feladat\nA nyitó kódszámok sorai:\n", kodok.azonosak_kiir(egykod), sep='')

# 4. feladat
print("4. feladat\nAz első ismétlődést tartalmazó próbálkozás sorszáma:", kodok.ismetlodeses_kodok_kkir())

# 5. feladat
veletlen = egykod.veletlenkod()
print("5. feladat\nEgy", veletlen.hossz, "hosszú kódszám:", veletlen.kod)

# 7. feladat
fajl = Fajl('sikerOOP.txt')
fajl.kiir(kodok.siker_kiir(egykod))
print("7. feladat\nFájlbaírás kész.")
