import { type Combatant, createEncounter, type Encounter, isDomainError, rehydrateCombatant, } from "@initiative/domain"; const STORAGE_KEY = "initiative:encounter"; export function saveEncounter(encounter: Encounter): void { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(encounter)); } catch { // Silently swallow errors (quota exceeded, storage unavailable) } } export function rehydrateEncounter(parsed: unknown): Encounter | null { if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return null; const obj = parsed as Record; if (!Array.isArray(obj.combatants)) return null; if (typeof obj.activeIndex !== "number") return null; if (typeof obj.roundNumber !== "number") return null; const combatants = obj.combatants as unknown[]; // Handle empty encounter (cleared state) directly — createEncounter rejects empty arrays if (combatants.length === 0) { return { combatants: [], activeIndex: 0, roundNumber: 1, }; } const rehydrated: Combatant[] = []; for (const c of combatants) { const result = rehydrateCombatant(c); if (result === null) return null; rehydrated.push(result); } const encounter = createEncounter( rehydrated, obj.activeIndex, obj.roundNumber, ); if (isDomainError(encounter)) return null; return encounter; } export function loadEncounter(): Encounter | null { try { const raw = localStorage.getItem(STORAGE_KEY); if (raw === null) return null; const parsed: unknown = JSON.parse(raw); return rehydrateEncounter(parsed); } catch { return null; } }