﻿"""
Zadanie 2: Zaawansowane pola i fabryki (field, default_factory)
Scenariusz: System obsługi zamówień wykorzystujący fabryki pól do generowania unikalnych list.
"""

from dataclasses import dataclass, field

@dataclass
class Zamowienie:
    """
    Klasa reprezentująca pojedyncze zamówienie w systemie.
    Wykorzystuje zaawansowaną konfigurację pól z modułu dataclasses.
    """
    klient: str
    
    # Używamy repr=False, aby to pole nie było wyświetlane przy wywołaniu print().
    # Chroni to dane wrażliwe (np. hasła) przed pojawieniem się w logach systemowych.
    haslo: str = field(repr=False)
    
    # Parametr default_factory służy do dynamicznego tworzenia nowej, unikalnej instancji
    # listy dla każdego nowo utworzonego obiektu Zamowienie.
    # Zastosowanie puste listy `[]` jako wartości domyślnej (`produkty: list = []`)
    # doprowadziłoby do współdzielenia tej samej listy przez wszystkie obiekty, co jest błędem.
    produkty: list = field(default_factory=list)
    
    # Przypisujemy stałą wartość domyślną 0.
    id_transakcji: int = field(default=0)

if __name__ == "__main__":
    # Tworzymy dwa odrębne zamówienia.
    z1 = Zamowienie("Jan", "sekret123")
    z2 = Zamowienie("Ewa", "haslo456")

    # Dodajemy produkt tylko do pierwszego zamówienia.
    print(">>> z1 = Zamowienie(\"Jan\", \"sekret123\")")
    print(">>> z2 = Zamowienie(\"Ewa\", \"haslo456\")")
    print(">>> z1.produkty.append(\"Laptop\")")
    z1.produkty.append("Laptop")

    # Sprawdzamy zawartość listy produktów w drugim zamówieniu.
    # Dzięki default_factory lista w `z2` powinna pozostać pusta.
    print(">>> print(z2.produkty)")
    print(z2.produkty)

    # Wyświetlamy raport o zamówieniu.
    # Hasło nie powinno być widoczne w wygenerowanym ciągu znaków, dzięki repr=False.
    print(">>> print(z1)")
    print(z1)
