﻿class Employee:
    """
    Klasa reprezentująca pracownika.
    Zawiera atrybut klasy do zliczania wszystkich utworzonych obiektów.
    """
    # Atrybut klasy (wspólny dla wszystkich instancji)
    # Zostaje zainicjowany wartością 0 przy ładowaniu definicji klasy.
    counter = 0 

    def __init__(self, first_name: str, last_name: str):
        """
        Konstruktor klasy. Inicjalizuje nową instancję pracownika.
        
        :param first_name: Imię pracownika (atrybut instancji)
        :param last_name: Nazwisko pracownika (atrybut instancji)
        """
        self.first_name = first_name
        self.last_name = last_name
        
        # Zwiększamy globalny licznik klasy przy każdym utworzeniu instancji.
        # Używamy pełnej nazwy klasy (Employee.counter), aby zmodyfikować 
        # wspólny atrybut, a nie stworzyć lokalną kopię (self.counter).
        Employee.counter += 1

    @classmethod
    def display_employee_count(cls):
        """
        Metoda klasowa do wyświetlania aktualnej liczby pracowników.
        Dekorator @classmethod sprawia, że metoda przyjmuje klasę (cls) 
        jako pierwszy argument, a nie instancję (self).
        """
        # Odczytujemy stan licznika za pomocą parametru cls, który jest referencją do klasy
        print(f"Aktualna liczba pracowników: {cls.counter}")

# --- Sekcja testowa ---
if __name__ == "__main__":
    # Wywołujemy metodę klasową przed stworzeniem jakiegokolwiek obiektu.
    # Spodziewany wynik: 0
    print("Przed zatrudnieniem:")
    Employee.display_employee_count()
    
    print("\nTworzenie pracowników...")
    # Tworzymy pierwszego pracownika
    e1 = Employee("Jan", "Kowalski")
    print(f"Zatrudniono: {e1.first_name} {e1.last_name}")
    
    # Tworzymy drugiego pracownika
    e2 = Employee("Anna", "Nowak")
    print(f"Zatrudniono: {e2.first_name} {e2.last_name}")
    
    print("\nPo zatrudnieniu:")
    # Wywołujemy metodę klasową ponownie, by sprawdzić, czy licznik wzrósł.
    # Spodziewany wynik: 2
    Employee.display_employee_count()
