﻿class Zwierze:
    """
    Klasa symulująca zachowanie wirtualnego zwierzątka (Tamagotchi).
    Ukazuje potęgę dekoratorów @property i seterów w hermetyzowaniu logiki ograniczającej
    wartości parametrów do sztywnych zakresów min/max.
    """
    def __init__(self, imie: str):
        self.imie = imie
        # Zamiast bezpośrednio deklarować pola publiczne, tworzymy pola ukryte (_glod, _energia).
        # Zainicjowanie ich początkowych wartości.
        self._glod = 0
        self._energia = 100

    # --- OGRANICZENIA LOGICZNE PRZY UŻYCIU DEKORATORÓW ---

    @property
    def glod(self) -> int:
        """Odczyt aktualnego poziomu głodu."""
        return self._glod

    @glod.setter
    def glod(self, wartosc: int):
        """
        Setter dla głodu. Automatycznie dba o to, by wartość nigdy nie 
        spadła poniżej 0 i nie przekroczyła 100, bez względu na to jak
        skrajna liczba zostanie tu przekazana.
        """
        # max(0, wartosc) gwarantuje dół przedziału, 
        # min(100, max(0, wartosc)) gwarantuje górę przedziału.
        self._glod = min(100, max(0, wartosc))

    @property
    def energia(self) -> int:
        """Odczyt aktualnego poziomu energii."""
        return self._energia

    @energia.setter
    def energia(self, wartosc: int):
        """
        Setter dla energii. Gwarantuje przedział 0 - 100.
        Dzięki temu mechanizmowi, w reszcie metod (karm, baw_sie) 
        nie musimy pamiętać o sprawdzaniu limitów!
        """
        self._energia = min(100, max(0, wartosc))

    # --- METODY AKCJI ---

    def baw_sie(self):
        """
        Symuluje wspólną zabawę. Odejmuje energię, zwiększa głód.
        Nie musimy się martwić, czy energia spadnie poniżej zera, bo dbają o to setery.
        """
        if self.energia < 20:
            print(f"{self.imie} jest zbyt zmęczony na zabawę!")
        else:
            # Poniższe przypisania wywołują niejawnie nasze setery @glod.setter i @energia.setter!
            self.energia -= 20
            self.glod += 15
            print(f"Bawisz się z pupilem {self.imie}.")

    def karm(self):
        """
        Redukuje poziom głodu zwierzaka.
        Zabezpieczenia z seterów nie dopuszczą do powstania 'ujemnego' głodu.
        """
        self.glod -= 20
        print(f"Karmisz pupila {self.imie}.")

    def status(self):
        """Generuje zbiorczy raport o kondycji życiowej podopiecznego."""
        print(f"Zwierzę: {self.imie} | Głód: {self.glod} | Energia: {self.energia}")


if __name__ == "__main__":
    print("--- ZADANIE 05 ---")
    pupil = Zwierze("Burek")
    
    # Zabawa
    pupil.baw_sie()
    pupil.status()
    
    # Karmienie
    pupil.karm()
    pupil.status()
    
    # Testowanie granic bezpieczeństwa wprowadzonych przez setery
    print("\n[Eksperyment] Próba zakarmienia (ujemny głód) oraz zamęczenia na śmierć:")
    for _ in range(10):
        pupil.karm() # Próbujemy zejść poniżej zera
    pupil.status() # Zobaczymy, że głód zatrzyma się bezpiecznie na 0
    
    pupil.baw_sie()
    pupil.status()
