""" StreakController — wraps StreakStore operations. Handles (de)serialisation to/from the BrowserState dict. """ from models.session_models import StreakStore, ModuleKey, FREE_MODULE_MAP class StreakController: @staticmethod def record(raw_store: dict | None, module_key: ModuleKey, duration_sec: int = 0) -> dict: """ Record a session and return the updated raw store dict. minimum 5 seconds (mirrors JS MIN_SESSION_SEC) — caller decides, but we still save the entry even if short; view shows the toast. """ store = StreakStore.from_raw(raw_store) store = store.record_session(module_key, duration_sec) return store.to_raw() @staticmethod def from_raw(raw: dict | None) -> StreakStore: return StreakStore.from_raw(raw) @staticmethod def free_module_to_key(choice: str) -> ModuleKey: return FREE_MODULE_MAP.get(choice, ModuleKey.JAM)