/**
 * Persistance "session" pour le mock MSW.
 *
 * Simule le pattern réel de l'ADR-017 : access token éphémère côté SPA +
 * refresh token persistant côté serveur (cookie httpOnly). Comme on n'a pas
 * de vrai cookie, on écrit la session dans localStorage. C'est suffisant pour
 * que :
 *   1. MSW puisse répondre à POST /auth/refresh (= simule le cookie côté
 *      "serveur") — le SPA récupère sa session au boot, sans avoir à se
 *      reconnecter à chaque reload.
 *   2. Logout efface la persistance (clean disconnect).
 *
 * Le SPA n'accède PAS directement à ce module — seuls les handlers MSW le
 * touchent. Le SPA reste fidèle au contrat HTTP.
 */
import type { User } from "@rubis/shared";

const STORAGE_KEY = "rubis.mocks.session";

export type StoredSession = {
  accessToken: string;
  /** ISO 8601 — au-delà, on considère la session expirée et on rejette. */
  expiresAt: string;
  user: User;
};

export const sessionStore = {
  get(): StoredSession | null {
    if (typeof localStorage === "undefined") return null;
    try {
      const raw = localStorage.getItem(STORAGE_KEY);
      if (!raw) return null;
      const parsed = JSON.parse(raw) as StoredSession;
      // Expiration soft : on tolère 30 jours pour le mock (le vrai refresh
      // token aura un TTL côté API). Au-delà, on jette pour simuler un
      // cookie expiré.
      const now = Date.now();
      const expiresMs = new Date(parsed.expiresAt).getTime();
      if (expiresMs < now - 30 * 24 * 60 * 60 * 1000) {
        sessionStore.clear();
        return null;
      }
      return parsed;
    } catch {
      return null;
    }
  },
  set(session: StoredSession): void {
    if (typeof localStorage !== "undefined") {
      localStorage.setItem(STORAGE_KEY, JSON.stringify(session));
    }
  },
  clear(): void {
    if (typeof localStorage !== "undefined") {
      localStorage.removeItem(STORAGE_KEY);
    }
  },
};
