#!/usr/bin/env python3
"""
Zadanie 9: Gra w zgadywanie liczby
Gra w zgadywanie losowej liczby z roznych poziomami trudnosci.
"""

import random
import json
import os


PLIK_STATYSTYK = 'statystyki.json'


POZIOMY = {
    '1': ('latwy', 50),
    '2': ('sredni', 100),
    '3': ('trudny', 500)
}


def laduj_statystyki():
    """Laduje statystyki z pliku."""
    if not os.path.exists(PLIK_STATYSTYK):
        return {'najlepsze': {}, 'gry': 0}
    try:
        with open(PLIK_STATYSTYK, 'r', encoding='utf-8') as f:
            return json.load(f)
    except (json.JSONDecodeError, IOError):
        return {'najlepsze': {}, 'gry': 0}


def zapisz_statystyki(statystyki):
    """Zapisuje statystyki do pliku."""
    with open(PLIK_STATYSTYK, 'w', encoding='utf-8') as f:
        json.dump(statystyki, f, ensure_ascii=False, indent=2)


def wybierz_poziom():
    """Pozwala wybrac poziom trudnosci."""
    print("\n" + "=" * 40)
    print("  WYBOR POZIOMU TRUDNOSCI")
    print("=" * 40)
    print("1 - Latwy (1-50)")
    print("2 - Sredni (1-100)")
    print("3 - Trudny (1-500)")
    print("4 - Wroc do menu glownego")
    
    wybor = input("Wybierz poziom (1-4): ").strip()
    
    if wybor in POZIOMY:
        return POZIOMY[wybor]
    return None


def gra(nazwa_poziomu, max_liczba):
    """Glowna petla gry."""
    print("\n" + "=" * 40)
    print("  GRA W ZGADYWANIE LICZBY")
    print("=" * 40)
    print(f"Poziom: {nazwa_poziomu}")
    print(f"Zgadnij liczbe z zakresu 1-{max_liczba}")
    print("=" * 40)
    
    liczba = random.randint(1, max_liczba)
    proby = 0
    proby_max = max_liczba.bit_length() + 5
    
    while True:
        proby += 1
        
        guess = input(f"\nProbe {proby}/{proby_max}. Twoja liczba: ").strip()
        
        if not guess:
            continue
        
        if guess.lower() == 'q':
            print(f"\nPoddales sie. Szukana liczba byla: {liczba}")
            return None
        
        if guess.lower() == 'n':
            print(f"\nNowa gra! Szukana liczba: {liczba}")
            liczba = random.randint(1, max_liczba)
            proby = 0
            continue
        
        if not guess.isdigit():
            print("Blad: Wpisz liczbe calkowita.")
            continue
        
        zgadnij = int(guess)
        
        if zgadnij < 1 or zgadnij > max_liczba:
            print(f"Liczba musi byc w zakresie 1-{max_liczba}.")
            continue
        
        if zgadnij == liczba:
            print(f"\n*** BRAWO! Znalazles liczbe w {proby} probach! ***")
            return proby
        elif zgadnij < liczba:
            print("Za malo!")
        else:
            print("Za duzo!")
        
        if proby >= proby_max:
            print(f"\nKoniec czasu! Szukana liczba byla: {liczba}")
            return None


def aktualizuj_statystyki(nazwa_poziomu, proby):
    """Aktualizuje statystyki po grze."""
    statystyki = laduj_statystyki()
    statystyki['gry'] += 1
    
    if proby is not None:
        if nazwa_poziomu not in statystyki['najlepsze'] or proby < statystyki['najlepsze'][nazwa_poziomu]:
            statystyki['najlepsze'][nazwa_poziomu] = proby
    
    zapisz_statystyki(statystyki)
    return statystyki


def pokaz_statystyki():
    """Wyswietla statystyki."""
    statystyki = laduj_statystyki()
    
    print("\n" + "=" * 40)
    print("  STATYSTYKI")
    print("=" * 40)
    print(f"Calkowita liczba gier: {statystyki['gry']}")
    
    if statystyki['najlepsze']:
        print("\nNajlepsze wyniki:")
        for poziom, naj in statystyki['najlepsze'].items():
            print(f"  {poziom}: {naj} prob")


def main():
    """Glowna funkcja programu."""
    while True:
        print("\n" + "=" * 40)
        print("  GRA W ZGADYWANIE LICZBY")
        print("=" * 40)
        print("1 - Nowa gra")
        print("2 - Statystyki")
        print("3 - Wyjscie")
        
        wybor = input("Wybierz opcje (1-3): ").strip()
        
        if wybor == '1':
            wynik = wybierz_poziom()
            if wynik is None:
                continue
            
            nazwa_poziomu, max_liczba = wynik
            proby = gra(nazwa_poziomu, max_liczba)
            aktualizuj_statystyki(nazwa_poziomu, proby)
        
        elif wybor == '2':
            pokaz_statystyki()
        
        elif wybor == '3':
            print("Do widzenia!")
            break
        else:
            print("Nieprawidlowa opcja.")


if __name__ == "__main__":
    main()