﻿"""
Zadanie 3: Refaktoryzacja do SRP (Single Responsibility Principle)
Rozbicie monolitycznego kodu na mniejsze, wyspecjalizowane moduły.
"""

class DanePobieracz:
    """Odpowiada wyłącznie za ekstrakcję informacji ze źródeł danych."""
    def pobierz(self) -> dict:
        # Symulacja pobierania z API/Bazy Danych
        print("[DanePobieracz] Pobieranie danych z bazy/API...")
        return {"id": 1, "nazwa": "Raport sprzedaży", "wartosc": 15000}

class Formater:
    """Interfejs (lub klasa bazowa) dla formaterów."""
    def formatuj(self, dane: dict) -> str:
        raise NotImplementedError("Metoda formatuj() musi zostać zaimplementowana w klasie pochodnej.")

class HTMLFormater(Formater):
    """Konwertuje surowe dane na format znaczników HTML."""
    def formatuj(self, dane: dict) -> str:
        print("[HTMLFormater] Formatowanie danych do HTML...")
        html = f"<html>\n"
        html += f"  <head><title>{dane['nazwa']}</title></head>\n"
        html += f"  <body>\n"
        html += f"    <h1>{dane['nazwa']} (ID: {dane['id']})</h1>\n"
        html += f"    <p>Wartość całkowita: {dane['wartosc']} PLN</p>\n"
        html += f"  </body>\n"
        html += f"</html>"
        return html

class JSONFormater(Formater):
    """Alternatywny formater - konwertuje dane do JSON."""
    def formatuj(self, dane: dict) -> str:
        import json
        print("[JSONFormater] Formatowanie danych do JSON...")
        return json.dumps(dane, indent=4)

class PlikZapisywacz:
    """Zajmuje się fizycznym utrwalaniem wyników na dysku."""
    def zapisz(self, nazwa_pliku: str, zawartosc: str):
        print(f"[PlikZapisywacz] Zapisywanie pliku: {nazwa_pliku}...")
        with open(nazwa_pliku, "w", encoding="utf-8") as f:
            f.write(zawartosc)
        print("[PlikZapisywacz] Zapis zakończony sukcesem.")

class SystemRaportowy:
    """Klasa Koordynująca - scala cały proces za pomocą wstrzykiwania zależności."""
    # Dependency Injection (Wstrzykiwanie zależności) w konstruktorze
    def __init__(self, pobieracz: DanePobieracz, formater: Formater, zapisywacz: PlikZapisywacz):
        self.pobieracz = pobieracz
        self.formater = formater
        self.zapisywacz = zapisywacz
        
    def uruchom(self, nazwa_pliku: str):
        """Uruchamia kompletny potok przetwarzania danych."""
        print("\n--- START PROCESU RAPORTOWEGO ---")
        dane = self.pobieracz.pobierz()
        sformatowane_dane = self.formater.formatuj(dane)
        self.zapisywacz.zapisz(nazwa_pliku, sformatowane_dane)
        print("--- KONIEC PROCESU RAPORTOWEGO ---")

# Testy (Zadanie 3)
if __name__ == "__main__":
    # Inicjalizacja poszczególnych "klocków" (modułów)
    pobieracz = DanePobieracz()
    formater_html = HTMLFormater()
    zapisywacz = PlikZapisywacz()
    
    # Przekazujemy klocki do głównego systemu
    sys_html = SystemRaportowy(pobieracz, formater_html, zapisywacz)
    sys_html.uruchom("raport.html")
    
    # Dzięki SRP łatwo podmienić format z HTML na JSON! 
    # Bez zmieniania klasy SystemRaportowy, ani DanePobieracz, ani PlikZapisywacz.
    formater_json = JSONFormater()
    sys_json = SystemRaportowy(pobieracz, formater_json, zapisywacz)
    sys_json.uruchom("raport.json")
    
    print("\n[INFO] Zobacz wygenerowane pliki raport.html i raport.json.")
