def kiir(ssz, szoveg):
    print('{}. feladat - {}'.format(ssz, szoveg))


# -----------------------------------------------------------------------------
# 1. Olvassa be a pitypang.txt állományban található maximum 1000 foglalás
#    adatát, s annak felhasználásával oldja meg a következő feladatokat!
#    Ha az állományt nem tudja beolvasni, akkor a benne található adatok közül
#    az 1-5, 326-330 és 695-699 foglalási sorszámú sorok adatait jegyezze be a
#    programba, s úgy oldja meg a feladatokat!
# -----------------------------------------------------------------------------
kiir(1, 'Adatok beolvasása')

# A szálloda eddigi foglalásait a pitypang.txt fájl tartalmazza. Az első
# sor a fájlban tárolt foglalások számát mutatja. A további sorokban
# szóközzel elválasztva soronként az alábbi adatok találhatók:
#   • a foglalás sorszáma,                      0
#   • a szoba száma (1–27),                     1
#   • az érkezés napjának sorszáma,             2
#   • a távozás napjának sorszáma,              3
#   • a vendégek száma,                         4
#   • kérnek-e reggelit (1=igen vagy 0=nem),    5
#   • a foglalást végző vendég nevéből képzett azonosítója
#     (maximum 25 karakter).                    6
# A napok sorszámozása január 1-jétől (1-es sorszám) kezdődik. Április 30-hoz
# például a 31 + 28 + 31 + 30 = 120-as sorszám tartozik.
# A Tóth család foglalása ebben a szerkezetben a következőképpen néz ki:
#      123 21 120 124 3 1 Toth_Balint
# A fájl egy éven belül tartalmaz foglalásokat. Az adatok az érkezés napja
# szerint növekvő sorrendben vannak rendezve a fájlban.
fbe = open('pitypang.txt', 'r')

adatok = []
N = fbe.readline()
print(N)
for sor in fbe:
    sor = sor.strip().split()
    adatok.append(sor)

fbe.close()

fbe = open('honapok.txt', 'r')
honap = []  # csak a hónapok kezdőnapja kell
egy = []
i = 1
for sor in fbe:
    egy.append(sor.rstrip())
    if i % 3 == 0:
        honap.append(int(sor.rstrip()))
        egy = []
    i += 1
honap.append(366)
# 366-os érték a decemberi érkezések miatt kell majd a 4. feladatban
fbe.close()

# -----------------------------------------------------------------------------
# 2. Jelenítse meg a képernyőn a leghosszabb szállodai tartózkodást! Csak
#    az időtartamot vegye figyelembe, azaz nem számít, hogy hány vendég
#    lakott az adott szobában! Az esetlegesen azonos hosszúságú tartózkodások
#    közül bármelyiket kiválaszthatja. Az eredményt ebben a formában írja a
#    képernyőre: Név (érkezési_nap_sorszáma) – eltöltött_éjszakák_száma
#    Például: Nagy_Bertalan (105) – 16
# -----------------------------------------------------------------------------
kiir(2, 'Leghosszabb tartózkodás')

# egyszerű maximumkeresési algoritmus
maxh = ['', '', 0]  # [Név,Érkezési nap sorszáma,Eltöltött éjszaka]
for adat in adatok:
    ejszaka = int(adat[3]) - int(adat[2])
    if ejszaka > maxh[2]:
        maxh[0] = adat[6]  # név
        maxh[1] = adat[0]  # foglalás sorszáma
        maxh[2] = ejszaka
print('{} ({}) - {}'.format(maxh[0], maxh[1], maxh[2]))

# -----------------------------------------------------------------------------
# 3. Számítsa ki, hogy az egyes foglalások után mennyit kell fizetnie az
#    egyes vendégeknek! A foglalás sorszámát és a kiszámított értékeket
#    kettősponttal elválasztva írja ki a bevetel.txt fájlba! Ez – a példában
#    szereplő Tóth család esetén – a következő lenne: 123:57200
# -----------------------------------------------------------------------------
kiir(3, 'Bevétel')

fki = open('bevetel.txt', 'w')

def szamol(adat):
    # nyári időszak a 121. napon, míg az őszi a 244. napon kezdődik
    fizet = 0
    ejszaka = int(adat[3]) - int(adat[2])  # távozás-érkezés
    if int(adat[2]) < 121:
        fizet += 9000 * ejszaka  # tavaszi időszak ára szerint
    elif int(adat[2]) > 243:
        fizet += 8000 * ejszaka  # őszi időszak ára szerint
    else:
        fizet += 10000 * ejszaka  # nyári időszak ára szerint
    if int(adat[4]) > 2:  # létszám>2 akkor pótágy is van
        fizet += ejszaka * 2000
    if adat[5] == '1':  # ha kérnek reggelit, akkor...
        fizet += ejszaka * int(adat[4]) * 1100
    return fizet

for adat in adatok:
    s = adat[0] + ':' + str(szamol(adat))
    print(s, file=fki)

fki.close()

# -----------------------------------------------------------------------------
# 4. Készítsen statisztikát az egyes hónapokban eltöltött
#    vendégéjszakákról! Egy vendégéjszakának egy fő egy eltöltött éjszakája
#    számít. A példában szereplő Tóth család áprilisban 3, májusban pedig 9
#    vendégéjszakát töltött a szállodában. Írassa ki a havi vendégéjszakák
#    számát a képernyőre az alábbi formában: hónap_sorszáma: x vendégéj
#    például: 8: 1059 vendégéj
# -----------------------------------------------------------------------------
kiir(4, 'Statisztika a vendégéjszakákról')


#   • a foglalás sorszáma,                      0
#   • a szoba száma (1–27),                     1
#   • az érkezés napjának sorszáma,             2
#   • a távozás napjának sorszáma,              3
#   • a vendégek száma,                         4
#   • kérnek-e reggelit (1=igen vagy 0=nem),    5
#   • a foglalást végző vendég nevéből képzett azonosítója
#     (maximum 25 karakter).                    6

def statisztika(adat):
    # függvény logikája:

    # honapok.txt-ben: a fiktiv hónap nem véletlen ott az elején
    # azért kellett, hogy a decemberi érkezésekkel ne legyen gond
    # a keresések során

    #   aprilis
    #   30
    #   91
    #   majus
    #   31
    #   121
    # Például:
    # ['296','16','110','122','2','0','Encsy_Gyorgy']
    #             110 (4):121-110=11  (5):122-121=1
    # érkezés napja melyik hónapban volt?
    erkezes = int(adat[2])
    tavozas = int(adat[3])
    vsz = int(adat[4])
    i = 0
    while erkezes >= honap[i]:
        i += 1
    # érkezés napja i-1. hónapra esik (indexelés, ugye!)
    # következő hónap kezdőnap-érkezés napja, ez megy az i-1.hónapba

    # távozás napja melyik hónapban volt?
    j = 0
    while tavozas >= honap[j]:
        j += 1
    # távozás napja-adott hónap kezdőnapja, ez megy a j-1.hónapba
    if i == j:
        v_ej = (tavozas - erkezes) * vsz  # ha nem volt "hónapváltás"
        havi_stat[i - 1] += v_ej
    else:
        v_ej = (honap[i] - erkezes) * vsz  # feltételezzük, hogy több hónapos tartózkodás
        havi_stat[i - 1] += v_ej  # nem volt
        v_ej = (tavozas - honap[j - 1]) * vsz
        havi_stat[j - 1] += v_ej

havi_stat = [0] * 12

for adat in adatok:
    statisztika(adat)

for i in range(12):
    print('{}: {} vendégéj'.format(i + 1, havi_stat[i]))

# -----------------------------------------------------------------------------
# 5. Kérje be a felhasználótól egy új foglalás kezdő dátumához tartozó nap
#    sorszámát és az eltöltendő éjszakák számát! Határozza meg, hogy hány
#    szoba szabad a megadott időszak teljes időtartamában! A választ írassa
#    ki a képernyőre!
# -----------------------------------------------------------------------------
kiir(5, 'Adott időben a szabad szobák száma')

erk = int(input('Érkezési nap sorszáma: '))
ejsz = int(input('Éjszakák száma: '))

# 27 szoba van, kezdetben mind legyen szabad, és ha mégsem, akkor legyen foglalt
szabad = [True] * 27

for adat in adatok:
    erkezes = int(adat[2])
    tavozas = int(adat[3])
    szoba = int(adat[1]) - 1  # indexelés
    if (erkezes < erk + ejsz and tavozas > erk):  # ha kívánt intervallum le van fedve
        szabad[szoba] = False  # akkor az a szoba foglalt

szabad_db = 0
for sz in szabad:
    if sz == True:
        szabad_db += 1
print('Szabad szobák száma: {}'.format(szabad_db))