import json  # knihovna co mi parsuje json do slovniku
import sys
import random
from pygame.locals import *
from usefulThings import *  # vlastni knihovna s vecme co sem nechtel cpat do tohodle souboru, je k videni v hornim radku


def vykresli():  # funkce co v každém kole vykreslí hrací plán
    obrazovka.fill(BLACK)
    for x in range(N):  # projdu cele pole s hraci plochou
        for y in range(M):
            if hracipole[x][y] == "C":  # vykreslení cíle
                obrazovka.blit(finishImg, (x * 32, y * 32))
            if hracipole[x][y][0] == "Z":  # vykresleni zdi
                obrazovka.blit(wallImg, (x * 32, y * 32))
                if len(hracipole[x][y]) > 1:  # pokud ma za sebou cislo, tak ho vypis
                    obdelnik = cislice[int(hracipole[x][y][1])].get_rect()
                    obdelnik.center = (x * 32 + 16, y * 32 + 16)
                    obrazovka.blit(cislice[int(hracipole[x][y][1])], obdelnik)
            if hracipole[x][y][0] == "J":  # vykresleni jidla
                obrazovka.blit(foodImg, (x * 32, y * 32))
                if len(hracipole[x][y]) > 1:  # pokud ma za sebou cislo, tak ho vypis
                    obdelnik = cislice[int(hracipole[x][y][1])].get_rect()
                    obdelnik.center = (x * 32 + 16, y * 32 + 16)
                    obrazovka.blit(cislice[int(hracipole[x][y][1])], obdelnik)
            if hracipole[x][y][0] == "B":  # vykresleni bomby
                obrazovka.blit(bombImg, (x * 32, y * 32))
                if len(hracipole[x][y]) > 1:  # pokud ma za sebou cislo, tak ho vypis
                    obdelnik = cislice[int(hracipole[x][y][1])].get_rect()
                    obdelnik.center = (x * 32 + 16, y * 32 + 16)
                    obrazovka.blit(cislice[int(hracipole[x][y][1])], obdelnik)

    obrazovka.blit(pacmanImg, (xpac * 32, ypac * 32))  # vykresleni pacmana
    textEnergie = fontObj.render(str(energie), True, RED)
    obdelnik = textEnergie.get_rect()
    obdelnik.center = (xpac * 32 + 16, ypac * 32 + 16)  # vykresleni cisla na pacmanovi ktere znázorňuje jeho energii
    obrazovka.blit(textEnergie, obdelnik)

    pygame.display.update()


pygame.init()
finishImg = pygame.image.load("finish32.png")  # načtení obrázků
bombImg = pygame.image.load("bomb32.png")
foodImg = pygame.image.load("cake32.png")
wallImg = pygame.image.load("blackwall32.png")
pacmanImg = pygame.image.load("pellet32.png")
fontObj = pygame.font.Font("AbhayaLibre-Medium.ttf", 32)
cislice = [fontObj.render(str(i), True, GREEN) for i in
           range(10)]  # zde si připravím texty číslic od 1 do 9 abych je mohl použít ve funkci vykresli

chuthrat = 1  # pokud uživatel řekne že už nechce hrát tak se celý program
nactenisouborusepovedlo = 0
while chuthrat:  # pokud uživatel řekne že už nechce hrát tak se celý program ukončí
    while nactenisouborusepovedlo == 0:
        try:
            file = open(input("Napiš název json souboru"), "r")
            soubor = file.readlines()  # všechno si uložím do jednoo pole
            celek = ""
            for i in soubor:
                celek += i.replace("\n",
                                   "")  # vždy odstraním konec řádku, abych json dostal do formátu kteřy moje knihovna umí zpracovat
            print(celek)
            nactenisouborusepovedlo = 1
            data = json.loads(celek)
            nactenisouborusepovedlo = 1
        except:
            print("soubor neexistuje nebo je nevalidní, prosím zadej jiný")
    nactenisouborusepovedlo = 0
    N = data["SIRKA"]#načtení dat ze souboru do proměnných
    M = data["VYSKA"]
    obrazovka = pygame.display.set_mode((N * 32, M * 32))  # vytvoreni okna s grafikou, jeden čtvereček má velikost 32*32 pixelů
    xpac, ypac, energie = data["START"]["X"] - 1, data["START"]["Y"] - 1, data["START"]["E"]
    xcil, ycil = data["CIL"]["X"], data["CIL"]["Y"]
    hracipole = [["" for _ in range(M)] for _ in range(N)]
    for y in range(M):
        for x, policko in enumerate(data["PLAN"][y].split(",")):
            hracipole[x][y] = policko
    hracipole[xcil - 1][ycil - 1] = "C"

    zivot = 1#proměnná do které ukládám jestli hráč žuje
    pohyb = ""#sem ukládám poslední pohyb
    bezpeci = int(input("Chceš mít zapnutý bezpečný režim pro toto kolo? 1 pro ane, 0 pro ne"))
    zmena_životů = 0#tohle používám pro sledování jestli se hráč stoupl na bombu nebo na zeď

    print("Nyní ovládej Pac-Mana za pomoci WSAD (musíš mít myš v okně hry) Můžeš hru také restartovat za pomoci klávesy R")
    while zivot:
        vykresli()
        klavesa = 0
        while klavesa != 1:
            for event in pygame.event.get():#ovládání z klávesnice
                if event.type == KEYUP and event.key == pygame.K_w:
                    pohyb = "S"
                    klavesa = 1
                if event.type == KEYUP and event.key == pygame.K_s:
                    pohyb = "J"
                    klavesa = 1
                if event.type == KEYUP and event.key == pygame.K_a:
                    pohyb = "Z"
                    klavesa = 1
                if event.type == KEYUP and event.key == pygame.K_d:
                    pohyb = "V"
                    klavesa = 1
                if event.type == KEYUP and event.key == pygame.K_r:
                    pohyb = "R"
                    klavesa = 1

        if pohyb == "R":
            break
        elif pohyb == "S" and ypac != 0:
            povedlse = 1
            ypac -= 1
        elif pohyb == "J" and ypac != M - 1:
            povedlse = 1
            ypac += 1
        elif pohyb == "Z" and xpac != 0:
            povedlse = 1
            xpac -= 1
        elif pohyb == "V" and xpac != N - 1:
            povedlse = 1
            xpac += 1
        else:
            povedlse = 0
            print("Nevalidní pohyb")
        energiepredpohybem = energie
        smaz = 1
        if povedlse == 1:#pokud se pohyb povedl tak udělej speciální akci políčka na které vstoupil
            energie -= 1
            if hracipole[xpac][ypac] != "V":
                if hracipole[xpac][ypac][0] == "B":
                    zmena_životů = 1
                    if len(hracipole[xpac][ypac]) > 1:
                        energie -= int(hracipole[xpac][ypac][1])
                    else:
                        energie = 0
                if hracipole[xpac][ypac][0] == "Z":
                    zmena_životů = 1
                    if len(hracipole[xpac][ypac]) > 1:
                        energie -= int(hracipole[xpac][ypac][1])
                    else:
                        energie = 0
                if hracipole[xpac][ypac][0] == "J":
                    energie += int(hracipole[xpac][ypac][1])
                    hracipole[xpac][ypac] = "V"
                if hracipole[xpac][ypac][0] == "C":
                    vykresli()
                    print("Vyhrál jsi. Chceš hrát dál? (A/N)")
                    chuthrat = input()
                    if chuthrat == "A":
                        chuthrat = 1
                    else:
                        chuthrat = 0
                    zivot = 0

            if energie <= 0:
                if bezpeci == 1 and zmena_životů == 1:#ošetření bezepečnho módu
                    print("Tam nechoď, tam by jsi umřel")
                    if pohyb == "S":  # vrácení pohybu
                        ypac += 1
                    if pohyb == "J":
                        ypac -= 1
                    if pohyb == "Z":
                        xpac += 1
                    if pohyb == "V":
                        xpac -= 1
                    energie = energiepredpohybem
                    smaz = 0#pokud jsem vrátil pohyb tak bombu smazat nechci
                else:#prohra
                    print("Došla ti šťáva, prohrál jsi. Chceš začít znovu? (A/N)")
                    chuthrat = input()
                    if chuthrat == "A":
                        chuthrat = 1
                    else:
                        chuthrat = 0
                    zivot = 0

            if zmena_životů == 1 and smaz == 1:#smazani pokud hráč přežil
                if hracipole[xpac][ypac][0] != "Z": hracipole[xpac][ypac] = "V"
        pohyb = 0
        zmena_životů = 0
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
