﻿"""
Zadanie 4: Komunikacja tekstowa (Serializacja do JSON)
Scenariusz: Zamiana obiektu klasy danych na tekst w formacie JSON i odwrotnie.
"""

import json
from dataclasses import dataclass, asdict

@dataclass
class Sensor:
    """
    Klasa modelująca odczyty z czujników inteligentnego domu.
    Służy jako podstawa do operacji serializacji do formatu tekstowego.
    """
    nazwa: str
    temp: float
    
    def to_json(self) -> str:
        """
        Metoda zamieniająca obiekt Sensor na ciąg znaków w formacie JSON.
        Hermetyzuje (ukrywa wewnątrz klasy) cały proces serializacji.
        """
        # asdict(self) zamienia obiekt (oraz jego zagnieżdżone elementy) na standardowy słownik.
        # Następnie json.dumps() konwertuje ów słownik na uniwersalny format tekstowy (string JSON).
        slownik = asdict(self)
        return json.dumps(slownik)

if __name__ == "__main__":
    # 1. Tworzymy obiekt czujnika i konwertujemy do JSON
    print(">>> s = Sensor(\"Kuchnia\", 22.5)")
    s = Sensor("Kuchnia", 22.5)
    
    print(">>> json_str = json.dumps(asdict(s))")
    json_str = json.dumps(asdict(s)) # Można również wywołać s.to_json()
    
    print(">>> print(json_str)")
    print(json_str)

    # 2. Deserializacja JSON do słownika
    print(">>> dane = json.loads(json_str)")
    dane = json.loads(json_str)
    
    # 3. Odtworzenie obiektu za pomocą operatora rozpakowywania słownika **
    print(">>> s_nowy = Sensor(**dane)")
    s_nowy = Sensor(**dane)
    
    print(f"\n[Dodatkowy test] Czy zdeserializowany obiekt jest identyczny z początkowym? {s == s_nowy}")
    print(f"[Dodatkowy test] s_nowy: {s_nowy}")
