﻿"""
Zadanie 2: Relacje między klasami (Kompozycja i Agregacja)
Prezentacja zarządzania cyklem życia obiektów (Memory / Ownership).
"""

class Procesor:
    """Klasa reprezentująca procesor. Część komputera (Kompozycja)."""
    def __init__(self, model: str):
        self.model = model
        print(f"[Procesor] Utworzono procesor: {self.model}")

    def __del__(self):
        """Destruktor - uruchamia się przy zwalnianiu pamięci."""
        print(f"[Procesor] Zniszczono procesor: {self.model}")

class UrzadzenieUSB:
    """Klasa bazowa dla urządzeń peryferyjnych (Agregacja)."""
    def __init__(self, nazwa: str):
        self.nazwa = nazwa
        print(f"[UrzadzenieUSB] Podłączono nowe urządzenie: {self.nazwa}")

    def __del__(self):
        print(f"[UrzadzenieUSB] Odłączono/Zniszczono urządzenie: {self.nazwa}")

class Mysz(UrzadzenieUSB):
    """Konkretne urządzenie USB (dziedziczenie)."""
    def __init__(self):
        super().__init__("Mysz optyczna")

class Komputer:
    """Klasa zarządzająca sprzętem - główny obiekt systemu."""
    def __init__(self):
        print("[Komputer] Budowanie komputera...")
        # Kompozycja (Strong relation) - Procesor jest tworzony wewnątrz komputera.
        # Należy całkowicie do niego i "umrze" razem z nim.
        self.cpu = Procesor("Intel Core i7")
        
        # Agregacja (Weak relation) - Urządzenia USB będą dodawane z zewnątrz.
        self.podlaczone_urzadzenia = []

    def podlacz_usb(self, urzadzenie: UrzadzenieUSB):
        """Dodaje zewnętrzne urządzenie (Agregacja)."""
        self.podlaczone_urzadzenia.append(urzadzenie)
        print(f"[Komputer] Podłączono pod USB: {urzadzenie.nazwa}")

    def __del__(self):
        print("[Komputer] Komputer jest niszczony (uruchamianie del)...")
        # Garbage collector za chwilę zniszczy self.cpu bo komputer "ginie".

# Test
if __name__ == "__main__":
    print("--- ROZPOCZĘCIE TESTU (ZADANIE 2) ---")
    
    # Tworzymy urządzenie niezależnie od komputera
    mysz = Mysz()
    
    # Tworzymy komputer (wewnątrz stworzy się instancja klasy Procesor)
    pc = Komputer()
    
    # Agregujemy urządzenie (mysz) do komputera
    pc.podlacz_usb(mysz)
    
    print("\n--- USUWANIE KOMPUTERA ---")
    # Niszczymy obiekt komputera (wymuszamy usunięcie referencji)
    # Uwaga: w Pythonie "del" usuwa nazwę zmiennej, obiekt jest niszczony
    # gdy licznik referencji spadnie do zera.
    del pc
    
    print("\n--- PO USUNIĘCIU KOMPUTERA ---")
    # Sprawdzamy, czy mysz nadal istnieje (powinna działać)
    print(f"Czy mysz nadal działa? Zmienna mysz posiada nazwę: {mysz.nazwa}")
    
    print("\n--- KONIEC SKRYPTU ---")
    # Przy zamykaniu programu Python posprząta resztę zmiennych (usunie mysz).
