import { captureCaught } from '@/lib/observability';

export function canUseLocalStorage(): boolean {
  try {
    return typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';
  } catch (err) {
    captureCaught(err, {
      scope: 'lib.offline.safeStorage.canUseLocalStorage',
      severity: 'warning',
    });
    return false;
  }
}

export function readLocalJson<T>(
  key: string,
  fallback: T,
  isValid: (value: unknown) => value is T,
): T {
  if (!canUseLocalStorage()) return fallback;
  try {
    const raw = window.localStorage.getItem(key);
    if (!raw) return fallback;
    const parsed = JSON.parse(raw);
    return isValid(parsed) ? parsed : fallback;
  } catch (err) {
    captureCaught(err, { scope: 'lib.offline.safeStorage.readLocalJson', severity: 'warning' });
    return fallback;
  }
}

export function writeLocalJson<T>(key: string, value: T): void {
  if (!canUseLocalStorage()) return;
  try {
    window.localStorage.setItem(key, JSON.stringify(value));
  } catch (err) {
    captureCaught(err, { scope: 'lib.offline.safeStorage.writeLocalJson', severity: 'warning' });
  }
}

export function removeLocalValue(key: string): void {
  if (!canUseLocalStorage()) return;
  try {
    window.localStorage.removeItem(key);
  } catch (err) {
    captureCaught(err, { scope: 'lib.offline.safeStorage.removeLocalValue', severity: 'warning' });
  }
}

export function readSessionString(key: string): string | null {
  if (typeof window === 'undefined' || typeof window.sessionStorage === 'undefined') return null;
  try {
    return window.sessionStorage.getItem(key);
  } catch (err) {
    captureCaught(err, { scope: 'lib.offline.safeStorage.readSessionString', severity: 'warning' });
    return null;
  }
}

export function writeSessionString(key: string, value: string): void {
  if (typeof window === 'undefined' || typeof window.sessionStorage === 'undefined') return;
  try {
    window.sessionStorage.setItem(key, value);
  } catch (err) {
    captureCaught(err, {
      scope: 'lib.offline.safeStorage.writeSessionString',
      severity: 'warning',
    });
  }
}
