class Hianyzas:
    def __init__(self, datum, nev, hiany):
        self.datum = datum
        self.nev = nev
        self.hiany = hiany


class Naplo:
    def __init__(self, hianyzasok=None):
        if hianyzasok is None:
            hianyzasok = []
        self.hianyzasok = hianyzasok

    def hianyzasok_szama(self):
        """naploban levo hianyzasok szama"""
        return len(self.hianyzasok)

    def igazolt(self):
        """igazolt hianyzasok szama"""
        return sum(h.hiany.count('X') for h in self.hianyzasok)

    def igazolatlan(self):
        """igazolatlan hianyzasok szama"""
        return sum(h.hiany.count('I') for h in self.hianyzasok)

    def hianyzas_db(self, nap, ora):
        """a het egy adott napjan egy adott orai hianyzasok szama"""
        return sum(1 for h in self.hianyzasok if h.datum.hetnapja() == nap and h.hiany[ora - 1] in ['X', 'I'])

    def legtobbet_hianyzo(self):
        """a legtobbet hianyzo tanulok"""
        return set([Tanulo(h.nev) for h in self.hianyzasok if
                    Tanulo(h.nev).hianyzas() == max(Tanulo(h.nev).hianyzas() for h in self.hianyzasok)])

    def legtobbet_hianyzo_kiir(self):
        """a legtobbet hianyzo tanulok neve kiir"""
        nevek = sorted(set(t.nev for t in self.legtobbet_hianyzo()))
        return ' '.join(nevek)


class Datum:
    """datum osztalya"""

    def __init__(self, ho, nap):
        self.ho = ho
        self.nap = nap

    def __eq__(self, other):
        if self.ho == other.ho and self.nap == other.nap:
            return True
        else:
            return False

    def hetnapja(self):
        """4. feladat: A het napjat adaja a datumbol"""
        napnev = ['vasarnap', 'hetfo', 'kedd', 'szerda', 'csutortok', 'pentek', 'szombat']
        napszam = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 335]
        napsorszam = (napszam[self.ho - 1] + self.nap) % 7
        return napnev[napsorszam]


class Tanulo:
    """tanulo osztalya"""
    global naplo

    def __init__(self, nev):
        self.nev = nev

    def hianyzas(self):
        """hianyzasainak szama"""
        return sum(h.hiany.count('X') + h.hiany.count('I') for h in naplo.hianyzasok if h.nev == self.nev)


class Fajl:
    """Fajlmuveletek osztalya"""

    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        hianyzasok = []
        f = open(self.fnev)
        ho, nap = None, None
        for sor in f.readlines():
            a1, a2, a3 = sor.split()
            if a1 == "#":
                ho = int(a2)
                nap = int(a3)
            else:
                nev = a1 + " " + a2
                hianyzas = a3
                hianyzasok.append(Hianyzas(Datum(ho, nap), nev, hianyzas))
        f.close()
        return hianyzasok

    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('naplo.txt')
naplo = Naplo(fajl.beolvas())

# 2. feladat
print("2. feladat\nA naplóban", naplo.hianyzasok_szama(), "bejegyzés van.")

# 3. feladat
print("3. feladat\nAz igazolt hiányzások száma ", naplo.igazolt(), ", az igazolatlanoké ", naplo.igazolatlan(), " óra.",
      sep='')

# 5. feladat
honap = int(input("5. feladat\nA hónap sorszáma: "))
nap = int(input("A nap sorszáma: "))
print("Azon a napon", Datum(honap, nap).hetnapja(), "volt.")

# 6. feladat
n = input("6. feladat\nA nap neve: ")
o = int(input("Az óra sorszáma: "))
print("Ekkor összesen", naplo.hianyzas_db(n, o), "óra hiányzás történt.")

# 7. feladat
print("7. feladat\nA legtöbbet hiányzó tanulók: ")
print(naplo.legtobbet_hianyzo_kiir())
