import pygame
import time
import random
from Jablko import Jablko
from Waz import Waz
from Kierunek import Kierunek
from Jajo import Jajo

SZEROKOSC_EKRANU = 800
WYSOKOSC_EKRANU = 608
Punkty = 0


def wczytaj_najlepszy_wynik():
    try:
        with open('best_score.txt', 'r') as plik:
            dane = plik.read().split('\n')
            
            if len(dane) < 2:
                return 0, ''  
            najlepszy_wynik = int(dane[0])
            imie = dane[1]
            return najlepszy_wynik, imie
    except (FileNotFoundError, ValueError, IndexError):
        return 0, ''  


def zapisz_najlepszy_wynik(wynik, imie):
    with open('best_score.txt', 'w') as plik:
        plik.write(f"{wynik}\n{imie}")


def wpisz_imie(ekran, czcionka):
    tekst = ""
    wpisywanie = True
    while wpisywanie:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return None
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:  
                    return tekst
                elif event.key == pygame.K_BACKSPACE:  
                    tekst = tekst[:-1]
                else: 
                    tekst += event.unicode
        ekran.fill((255,255,255))  
        tekst_na_ekranie = czcionka.render(f"Wpisz swoje imię: {tekst}", True, (0, 0, 0))
        ekran.blit(tekst_na_ekranie, (SZEROKOSC_EKRANU // 2 - tekst_na_ekranie.get_width() // 2, WYSOKOSC_EKRANU // 2))
        pygame.display.flip()


def pokaz_gratulacje(ekran, czcionka, punkty, najlepszy_wynik, imie_gracza):
    ekran.fill((255, 255, 255))  
    gratulacje_tekst = f"Gratulacje! Nowy Najlepszy Wynik!"
    wynik_tekst = f"Twój wynik: {punkty}"
    najlepszy_tekst = f"Najlepszy wynik: {najlepszy_wynik}"
    imie_tekst = f"Imię: {imie_gracza}"
    

    gratulacje_render = czcionka.render(gratulacje_tekst, True, (0, 0, 0))
    wynik_render = czcionka.render(wynik_tekst, True, (0, 0, 0))
    najlepszy_render = czcionka.render(najlepszy_tekst, True, (0, 0, 0))
    imie_render = czcionka.render(imie_tekst, True, (0, 0, 0))
    
    ekran.blit(gratulacje_render, (SZEROKOSC_EKRANU // 2 - gratulacje_render.get_width() // 2, WYSOKOSC_EKRANU // 3))
    ekran.blit(wynik_render, (SZEROKOSC_EKRANU // 2 - wynik_render.get_width() // 2, WYSOKOSC_EKRANU // 3 + 40))
    ekran.blit(najlepszy_render, (SZEROKOSC_EKRANU // 2 - najlepszy_render.get_width() // 2, WYSOKOSC_EKRANU // 3 + 80))
    ekran.blit(imie_render, (SZEROKOSC_EKRANU // 2 - imie_render.get_width() // 2, WYSOKOSC_EKRANU // 3 + 120))
    
    pygame.display.flip()
    pygame.time.wait(3000)  

def gra():
    global Punkty
    tlo = pygame.Surface((SZEROKOSC_EKRANU, WYSOKOSC_EKRANU))
    for i in range(25):
        for j in range(19):
            obraz = pygame.image.load("images/background.png")
            maska = (random.randrange(0, 20), random.randrange(0, 20), random.randrange(0, 20))
            obraz.fill(maska, special_flags=pygame.BLEND_ADD)
            tlo.blit(obraz, (i * 32, j * 32))

    pygame.init()
    pygame.font.init()
    ekran = pygame.display.set_mode([SZEROKOSC_EKRANU, WYSOKOSC_EKRANU])
    zegar = pygame.time.Clock()
    moja_czcionka = pygame.font.SysFont('Comic Sans MS', 24)


    najlepszy_wynik, imie_gracza = wczytaj_najlepszy_wynik()

 
    waz = Waz()
    PORUSZ_WEZEM = pygame.USEREVENT + 1
    pygame.time.set_timer(PORUSZ_WEZEM, 200)

    jablko = Jablko()
    jablka = pygame.sprite.Group()
    jablka.add(jablko)

    jaja = pygame.sprite.Group()

    gra_dziala = True
    while gra_dziala:
        for zdarzenie in pygame.event.get():
            if zdarzenie.type == pygame.KEYDOWN:
                if zdarzenie.key == pygame.K_ESCAPE:
                    gra_dziala = False
                if zdarzenie.key == pygame.K_w:
                    waz.zmien_kierunek(Kierunek.GORA)
                if zdarzenie.key == pygame.K_s:
                    waz.zmien_kierunek(Kierunek.DOL)
                if zdarzenie.key == pygame.K_a:
                    waz.zmien_kierunek(Kierunek.LEWO)
                if zdarzenie.key == pygame.K_d:
                    waz.zmien_kierunek(Kierunek.PRAWO)
                if zdarzenie.key == pygame.K_o:
                    event_timer += 10
                    pygame.time.set_timer(PORUSZ_WEZEM, event_timer)
                if zdarzenie.key == pygame.K_p:
                    event_timer -= 10
                    pygame.time.set_timer(PORUSZ_WEZEM, event_timer)
            elif zdarzenie.type == PORUSZ_WEZEM:
                waz.aktualizuj()
            elif zdarzenie.type == pygame.QUIT:
                gra_dziala = False

        kolizja_z_jablkiem = pygame.sprite.spritecollideany(waz, jablka)
        if kolizja_z_jablkiem != None:
            kolizja_z_jablkiem.kill()
            waz.jedz_jablko()
            jablko = Jablko()
            jablka.add(jablko)
            Punkty += 1

            if (Punkty % 5) == 0:
                jajo = Jajo(waz.segmenty[-1].ostatnia_pozycja)
                jaja.add(jajo)

        kolizja_z_jajem = pygame.sprite.spritecollideany(waz, jaja)
        if kolizja_z_jajem != None:
            kolizja_z_jajem.kill()
            Punkty += 5

        ekran.blit(tlo, (0, 0))
        waz.rysuj_segmenty(ekran)
        ekran.blit(waz.obraz, waz.rect)
        for jablko in jablka:
            ekran.blit(jablko.obraz, jablko.rect)

        for jajo in jaja:
            ekran.blit(jajo.obraz, jajo.rect)

        tekst_z_wynikiem = moja_czcionka.render(f'Wynik: {Punkty}', False, (0, 0, 0))
        tekst_z_najlepszym = moja_czcionka.render(f'Najlepszy wynik: {najlepszy_wynik} {imie_gracza}', False,(0,0,0))
        ekran.blit(tekst_z_wynikiem, (16, 16))
        ekran.blit(tekst_z_najlepszym, (16, 40))

        if waz.sprawdz_kolizje():
            tekst_z_przegrana = moja_czcionka.render('Przegrana', False, (200, 0, 0))
            ekran.blit(tekst_z_przegrana, (SZEROKOSC_EKRANU / 2 - 50, WYSOKOSC_EKRANU / 2))
            gra_dziala = False

        pygame.display.flip()
        zegar.tick(30)

 
    if Punkty > najlepszy_wynik:
        najlepszy_wynik = Punkty
        imie_gracza = wpisz_imie(ekran, moja_czcionka)
        zapisz_najlepszy_wynik(najlepszy_wynik, imie_gracza)
        pokaz_gratulacje(ekran, moja_czcionka, Punkty, najlepszy_wynik, imie_gracza)

    time.sleep(3)
    pygame.quit()


gra()
