﻿class Produkt:
    """
    Klasa zarządzająca towarem w sklepie e-commerce.
    Obrazuje zastosowanie parametrów domyślnych w konstruktorze oraz
    wykorzystanie dekoratora @property do obliczeń w locie.
    """
    # Konstruktor przyjmuje domyślną wartość dla argumentu 'vat'.
    # Oznacza to, że jeśli przy tworzeniu obiektu nie podamy trzeciego parametru,
    # domyślnie przyjmie on wartość 0.23.
    def __init__(self, nazwa: str, cena_netto: float, vat: float = 0.23):
        self.nazwa = nazwa
        self.cena_netto = cena_netto
        self.vat = vat

    def pobierz_cene_brutto(self) -> float:
        """
        Standardowa metoda klasy wyliczająca cenę brutto.
        Wynik jest zawsze aktualny, ponieważ obliczany na podstawie
        aktualnej stawki vat i ceny netto.
        Zgodnie z wymaganiami, zwraca wynik działania matematycznego.
        """
        # Możemy dodatkowo zabezpieczyć się przed wieloma miejscami po przecinku
        return round(self.cena_netto * (1 + self.vat), 2)

    # --- UŻYCIE DEKORATORA @property ---
    # Alternatywne podejście - definiujemy 'cenę brutto' jako właściwość.
    # W nowoczesnym Pythonie tak tworzy się wartości dynamicznie wynikające z innych parametrów.
    @property
    def cena_brutto(self) -> float:
        """Właściwość zwracająca cenę brutto (korzysta z metody dla zasady DRY - Don't Repeat Yourself)."""
        return self.pobierz_cene_brutto()

    # --- UŻYCIE DEKORATORA @classmethod ---
    # Dekoratory @classmethod pozwalają na stworzenie tzw. 'alternatywnych konstruktorów'.
    # Metoda taka przyjmuje 'cls' (klasę) zamiast 'self' (instancji) i potrafi np.
    # zwrócić przygotowany obiekt bez VAT-u, ułatwiając i uczytelniając kod.
    @classmethod
    def zwolniony_z_vat(cls, nazwa: str, cena_netto: float):
        """Fabryka obiektów tworząca produkt zwolniony z opodatkowania."""
        # Wywołujemy główny konstruktor z VAT = 0
        return cls(nazwa, cena_netto, 0.0)

    def info(self):
        """
        Metoda agregująca dane o produkcie.
        Wypisuje szczegółową wycenę wykorzystując delegację do innych metod/właściwości.
        """
        # Korzystam tu bezpośrednio z @property cena_brutto dla demonstracji czytelności kodu.
        # {self.vat * 100:g} formatuje liczbę obcinając niepotrzebne zera po przecinku.
        print(f"Produkt: {self.nazwa}, Cena Netto: {self.cena_netto}, "
              f"VAT: {self.vat * 100:g}%, Cena Brutto: {self.cena_brutto}")


if __name__ == "__main__":
    print("--- ZADANIE 04 ---")
    # Zostanie wykorzystana domyślna wartość 0.23
    p1 = Produkt("Laptop", 3000)
    
    # Nadpisujemy domyślną stawkę wartością 0.05
    p2 = Produkt("Chleb", 4, 0.05)
    
    # Wywołanie tradycyjnej metody pobierz_cene_brutto() zgodnie ze scenariuszem zadania
    print(p1.pobierz_cene_brutto())
    
    # Sprawdzenie informacji
    p2.info()

    # Bonus: Zastosowanie metody klasowej (dekorator @classmethod)
    print("\n[Eksperyment] Tworzenie produktu poprzez alternatywny konstruktor:")
    p_zero = Produkt.zwolniony_z_vat("Woda", 2.50)
    p_zero.info()
