def f(ssz):
    print(f'{ssz}. feladat:')
#-----------------------------------------------------------------------------
# 1. Olvassa be a kiadas.txt vagy a kiadas2.txt bemeneti állományt, és tárolja
#    el annak tartalmát a memóriában úgy, hogy azokat a későbbi feladatok
#    megoldása során használni tudja!
#-----------------------------------------------------------------------------
def F1(fn):
    konyvek = []    # mátrix: minden könyv, mint lista szerepel majd benne
    # Ne feledjük, hogy UTF-8 kódolású forrásállomány (ez itt ékezetes)
    with open('kiadas.txt', 'r', encoding = 'utf-8') as fbe:
        for sor in fbe:
            sor = sor.strip().split(';')    # "szeparáló" jel a ; nem a szóköz
            sor[0:2] = map(int, sor[0:2])   # első kettő és utolsó adat integer  
            sor[-1] = int(sor[-1])
            konyvek.append(sor)
    return konyvek
#-----------------------------------------------------------------------------
# 2. Kérje be a felhasználótól egy szerző nevét, majd adja meg, hány alkalom-
#    mal adtak ki a szerzőtől művet az adatok szerint! Amennyiben a szerző
#    neve nem szerepel az adatok között, úgy a "Nem adtak ki" szöveget jele-
#    nítse meg!
#-----------------------------------------------------------------------------
def F2(konyvek):
    # kihasználjuk, hogy egy szerző más művében semmiképpen sem szerepel
    szerzo = input('Szerző: ')
    konyvkiadas = 0                 # számláló
    for konyv in konyvek:           # sorban vesszük a mátrixból a listákat (konyv)
        if szerzo in konyv[3]:      # in művelet: szerző benne van-e a leírásban (I/H)  
            konyvkiadas += 1
    print(f'{konyvkiadas} könyvkiadás')
#-----------------------------------------------------------------------------
# 3. Határozza meg és írja ki, hogy mennyi volt a legnagyobb kiadott példány-
#    szám, és ez hány könyv kiadása esetén fordult elő!
#-----------------------------------------------------------------------------
def F3(konyvek):
    # rendezéssel oldjuk meg, így könnyebb lesz a "hányszor van ez a maximum"
    # kérdésre válaszolni
    # RENDEZÉS - lambda kifejezés lényege: egy adott könyv utolsó eleme (példányszám)
    # alapján rendez. A mínusz előjel csökkenő rendezést ad, így az első elem a
    # maximális példányszámot tartalmazó könyv lesz...
    rendezett = sorted(konyvek, key = lambda konyv: -konyv[-1])
    mp = rendezett[0][-1]   # maximális példányszám: első könyv utolsó adata
    i = 1       # addig haladunk a rendezett mátrixban, amíg maximális példányszám van...
    while rendezett[i][-1] == mp:
        i += 1
    print(f'Legnagyobb példányszám: {mp}, előfordult {i} alkalommal')
#-----------------------------------------------------------------------------
# 4. Határozza meg, hogy melyik volt az első olyan külföldi szerzőtől származó
#    mű, amely legalább 40 000 példányban jelent meg! Tudjuk, hogy volt ilyen
#    könyv. Írja ki a kiadás évét és negyedévét, valamint a mű leírását a
#    mintának megfelelő formátumban: az évszám után perjel következzen,
#    a negyedév után pont álljon!
#-----------------------------------------------------------------------------
def F4(konyvek):
    # tudjuk, hogy volt ilyen könyv... Ez fontos!
    # azt is kihasználjuk, hogy időrendben vannak a könyvek...

    # while ciklus: indexet léptetjük a mátrixban, amíg egy megfelelő könyvet
    # nem találunk. A megfelelő könyv feltételrendszere van a NOT után.
    # (külföldi és legalább 40ezer példányszámú)
    i = 0
    while  not (konyvek[i][2] == 'kf' and konyvek[i][-1] >= 40000):
        i += 1
    konyv = konyvek[i]
    print(f'{konyv[0]}/{konyv[1]}. {konyv[3]}')
#-----------------------------------------------------------------------------
# 5. Készítsen statisztikát az olyan évekről, amelyekben szerepel, hogy hány
#    alkalommal és összesen mekkora példányszámban adtak ki magyar, illetve
#    külföldi könyvet!
#       a. Az eredményeket a mintához hasonlóan táblázatos formában jelenítse
#          meg a képernyőn: az első sorban a táblázat fejléce, a többi sorban
#          az adatok következzenek, soron belül tabulátorokkal elválasztva,
#          a mintának megfelelően!
#       b. Írja az eredményeket egy tabla.html szöveges állományba, amely egy
#          HTML-táblázatban helyesen tartalmazza a fejlécet és az eredmény-
#          sorokat! A kimeneti állományba csak a táblázat kódját írja a
#          program, más HTML-elemet ne!
#-----------------------------------------------------------------------------
def F5(konyvek):
    # Év    Magyar kiadás   Magyar példányszám  Külföldi kiadás Külföldi példányszám
    # 2020  45              834005              29              416000
    evek = [2020, 2021, 2022, 2023]   # 4 év van: négyszer ismételjük az adatgyűjtést
    adatok = []                       # ebben tárolom az összegyűjtött adatokat
    for ev in evek:                   # évek listáján haladunk (4 év, ugye...)
        madb, ma = 0, 0               # magyar könyvek darabszáma, és összpéldányszáma
        kfdb, kf = 0, 0               # ugyanaz a külföldi könyvekre
        for konyv in konyvek:         # konyvek mátrix bejárása
            if konyv[0] == ev:        # megfelelő évben vagyunk...
                if konyv[2] == 'ma':  # magyar...
                    madb += 1
                    ma += konyv[-1]
                else:                 # külföldi adatgyűjtés
                    kfdb += 1
                    kf += konyv[-1]
        adatok.append([ev, madb, ma, kfdb, kf])     # adatok listába kerül az adott év
                                                    # 4 adata

    # html
    with open('tabla.html', 'w', encoding = 'utf-8') as fki:
        print('<table>', file = fki)
        print('<tr><th>Év</th><th>Magyar kiadás</th><th>Magyar példányszám</th><th>Külföldi kiadás</th><th>Külföldi példányszám</th></tr>', file = fki)
        print(f'Év\tMagyar kiadás\tMagyar példányszám\tKülföldi kiadás\tKülföldi példányszám')
        for adat in adatok:
            print(f'{adat[0]}\t\t{adat[1]}\t\t{adat[2]}\t\t{adat[3]}\t\t{adat[4]}')
            print(f'<tr><td>{adat[0]}</td><td>{adat[1]}</td><td>{adat[2]}</td><td>{adat[3]}</td><td>{adat[4]}</td></tr>', file = fki)
        print('</table>', file = fki)
#-----------------------------------------------------------------------------
# 6. Szeretnénk tudni, hogy melyek voltak azok a könyvek, amelyeket az első 
#    kiadás után még legalább kétszer, az első kiadásnál nagyobb példányszám-
#    ban adtak ki újra. Keresse meg a megfelelő könyveket, és mindegyiket 
#    külön sorban jelenítse meg!
#-----------------------------------------------------------------------------
def F6(konyvek):
    print('Legalább kétszer, nagyobb példányszámban újra kiadott könyvek:')
    # a leírásokat egy halmazba gyűjtjük - a többször kiadott könyvek miatt
    leirasok = {konyv[3] for konyv in konyvek}  
    for leiras in leirasok:     # végigmegyünk az egyedi leírásokon
        adatok = []             # ebben a listában tároljuk a szükséges adatokat majd
        for konyv in konyvek:   # bejárjuk a mátrixot könyvenként
            if konyv[3] == leiras:  # ha az adott könyv leírása egyezik a halmaz adott elemével, akkor
                adatok.append([leiras, konyv[0], konyv[-1]])    # adatok tárolása (leírás, év, példányszám)
        # könyvek bájárása után, ha az adott leírás esetén legalább 3 adatgyűjtés volt, akkor
        if len(adatok) >= 3:
            peldanyszam = adatok[0][-1]     # időrend van --> első adat az első kiadás --> első példányszám
            eset = 0        # megszámláljuk, hány esetben volt, hogy a következő kiadások példányszáma
                            # nagyobb az első példányszámnál
            for adat in adatok:     # kigyűjtott adatok bejárása
                if adat[-1] > peldanyszam:      # példányszám nagyobb az elsőnél
                    eset += 1                   # számláló növekszik
            if eset >= 2:                       # ha minimum 2 eset volt, akkor képernyőre írjuk
                print(leiras)                   # a leírást
    # és a ciklus folytatódik a következő leírással... lsd. 118. sor

if __name__ == '__main__':
    kiadasok = F1('kiadas.txt')
    f(2)
    F2(kiadasok)
    f(3)
    F3(kiadasok)
    f(4)
    F4(kiadasok)
    f(5)
    F5(kiadasok)
    f(6)
    F6(kiadasok)


