﻿"""
Zadanie 1: Planowanie architektury (Diagram UML)
Ten skrypt zawiera implementację szkieletową klas z zaprojektowanego diagramu UML
oraz sam diagram w formacie Mermaid.

Diagram Mermaid:
classDiagram
    Biblioteka *-- Ksiazka : Kompozycja
    Biblioteka o-- Czytelnik : Agregacja
    Ksiazka o-- Autor : Agregacja
    
    class Biblioteka {
        -String nazwa
        -List~Ksiazka~ ksiazki
        -List~Czytelnik~ czytelnicy
        +dodaj_ksiazke(Ksiazka)
        +zarejestruj_czytelnika(Czytelnik)
        +szukaj_autora(String)
    }
    
    class Ksiazka {
        -String tytul
        -Autor autor
        -Boolean dostepna
        +wypozycz() Boolean
        +zwroc()
    }
    
    class Autor {
        -String imie
        -String nazwisko
        +pobierz_dane() String
    }
    
    class Czytelnik {
        -String id_czytelnika
        -String imie
        -List~Ksiazka~ wypozyczone_ksiazki
        +wypozycz_ksiazke(Ksiazka)
        +zwroc_ksiazke(Ksiazka)
    }
    
    Ksiazka <|-- Ebook : Dziedziczenie
    Ksiazka <|-- Audiobook : Dziedziczenie
    
    class Ebook {
        -String format_pliku
        -Float rozmiar_mb
        +pobierz()
    }
    
    class Audiobook {
        -String lektor
        -Float dlugosc_minuty
        +odtwarzaj()
    }
"""

class Autor:
    """Klasa reprezentująca autora książki."""
    def __init__(self, imie: str, nazwisko: str):
        # Pola prywatne
        self._imie = imie
        self._nazwisko = nazwisko
        
    def pobierz_dane(self) -> str:
        """Zwraca imię i nazwisko autora."""
        return f"{self._imie} {self._nazwisko}"

class Ksiazka:
    """Klasa reprezentująca książkę (agreguje Autora)."""
    def __init__(self, tytul: str, autor: Autor):
        self._tytul = tytul
        self._autor = autor
        self._dostepna = True
        
    def wypozycz(self) -> bool:
        """Oznacza książkę jako wypożyczoną, o ile jest dostępna."""
        if self._dostepna:
            self._dostepna = False
            return True
        return False
        
    def zwroc(self) -> None:
        """Zwraca książkę (ustawia flagę dostępności na True)."""
        self._dostepna = True

class Ebook(Ksiazka):
    """Klasa dziedzicząca po książce (dziedziczenie)."""
    def __init__(self, tytul: str, autor: Autor, format_pliku: str, rozmiar_mb: float):
        super().__init__(tytul, autor)
        self._format_pliku = format_pliku
        self._rozmiar_mb = rozmiar_mb

    def pobierz(self):
        print(f"Pobieranie e-booka {self._tytul} w formacie {self._format_pliku}...")

class Czytelnik:
    """Klasa reprezentująca czytelnika biblioteki."""
    def __init__(self, id_czytelnika: str, imie: str):
        self._id_czytelnika = id_czytelnika
        self._imie = imie
        self._wypozyczone_ksiazki = []
        
    def wypozycz_ksiazke(self, ksiazka: Ksiazka):
        """Wypożycza konkretną książkę."""
        if ksiazka.wypozycz():
            self._wypozyczone_ksiazki.append(ksiazka)
            print(f"Czytelnik {self._imie} wypożyczył '{ksiazka._tytul}'.")
        else:
            print(f"Książka '{ksiazka._tytul}' jest aktualnie niedostępna.")
            
    def zwroc_ksiazke(self, ksiazka: Ksiazka):
        """Zwraca książkę z powrotem do biblioteki."""
        if ksiazka in self._wypozyczone_ksiazki:
            ksiazka.zwroc()
            self._wypozyczone_ksiazki.remove(ksiazka)
            print(f"Czytelnik {self._imie} zwrócił '{ksiazka._tytul}'.")

class Biblioteka:
    """Główna klasa zarządzająca systemem (komponuje/agreguje pozostałe klasy)."""
    def __init__(self, nazwa: str):
        self._nazwa = nazwa
        self._ksiazki = []
        self._czytelnicy = []
        
    def dodaj_ksiazke(self, ksiazka: Ksiazka):
        self._ksiazki.append(ksiazka)
        
    def zarejestruj_czytelnika(self, czytelnik: Czytelnik):
        self._czytelnicy.append(czytelnik)

# Demonstracja (Test)
if __name__ == "__main__":
    print("--- PREZENTACJA STRUKTURY KLAS (ZADANIE 1) ---")
    bibl = Biblioteka("Biblioteka Główna")
    autor1 = Autor("Stanisław", "Lem")
    ksiazka1 = Ksiazka("Solaris", autor1)
    ebook1 = Ebook("Cyberiada", autor1, "EPUB", 2.5)
    czytelnik1 = Czytelnik("C001", "Jan Kowalski")
    
    bibl.dodaj_ksiazke(ksiazka1)
    bibl.dodaj_ksiazke(ebook1)
    bibl.zarejestruj_czytelnika(czytelnik1)
    
    czytelnik1.wypozycz_ksiazke(ksiazka1)
    czytelnik1.wypozycz_ksiazke(ebook1)
    
    print("\n--- TEST: PRÓBA PONOWNEGO WYPOŻYCZENIA ---")
    czytelnik2 = Czytelnik("C002", "Anna Nowak")
    czytelnik2.wypozycz_ksiazke(ksiazka1) # Powinno odrzucić, bo wypożyczona
    
    print("\n--- ZWROT ---")
    czytelnik1.zwroc_ksiazke(ksiazka1)
    czytelnik2.wypozycz_ksiazke(ksiazka1) # Teraz się uda
