﻿from abc import ABC, abstractmethod

# Interfejs Powiadomienie. W Pythonie realizujemy go poprzez 
# klasę dziedziczącą po ABC, w której wszystkie metody są abstrakcyjne i puste.
class Powiadomienie(ABC):
    
    @abstractmethod
    def wyslij(self, tekst):
        """
        Metoda, która musi być zaimplementowana przez każdego 
        dostawcę usługi powiadomień.
        """
        pass

# Konkretna implementacja dla E-maili
class EmailService(Powiadomienie):
    
    def wyslij(self, tekst):
        # Symulacja wysyłania e-maila
        print(f"Wysyłanie E-mail: {tekst}")

# Konkretna implementacja dla wiadomości SMS
class SmsService(Powiadomienie):
    
    def wyslij(self, tekst):
        # Symulacja wysyłania SMS-a
        print(f"Wysyłanie SMS: {tekst}")

# Dodatkowa usługa (PushNotification) dodana później, 
# bez modyfikowania głównego kodu wysyłającego.
class PushNotification(Powiadomienie):
    
    def wyslij(self, tekst):
        # Symulacja powiadomienia Push
        print(f"Wysyłanie powiadomienia Push: {tekst}")


# Funkcja operująca na ogólnym interfejsie.
# Nie musi wiedzieć z jakim konkretnym typem usługi ma do czynienia.
def wyslij_do_wszystkich(serwisy, msg):
    """
    Polimorficzne wywołanie metody wyslij na każdym obiekcie w liście.
    Programujemy do interfejsu (Powiadomienie), a nie do konkretnej implementacji (np. EmailService).
    Dzięki temu w przyszłości możemy dodawać nowe typy usług bez żadnych modyfikacji tej funkcji!
    """
    for s in serwisy:
        s.wyslij(msg)

if __name__ == "__main__":
    # Inicjalizacja różnych typów usług powiadomień
    uslugi = [
        EmailService(), 
        SmsService(), 
        PushNotification()
    ]
    
    # Wywołanie ogólnej funkcji - zauważ brak logiki typu if/else w funkcji.
    # To jest kluczowe w architekturze opartej na interfejsach.
    wyslij_do_wszystkich(uslugi, "Witaj na kursie!")
    
    print("\n--- Test z pustą listą ---")
    # Zgodnie z wymaganiami, system zachowuje pełną stabilność
    wyslij_do_wszystkich([], "Wiadomość z zaświatów")
    print("Test przebiegł pomyślnie - system był w pełni stabilny!")
