import { writable } from 'svelte/store';
import { mayAutoReload } from './engine-build';

const ENGINE_RELOAD_GUARD = 'malice-engine-reload';

export const engineStale = writable(false);
export const engineRecovered = writable(0);

let release: () => Promise<void> = () => Promise.resolve();

export function setEngineRelease(fn: () => Promise<void>): void {
  release = fn;
}

export function releaseEngine(): Promise<void> {
  return release();
}

function reloadWhenHidden(): void {
  if (document.visibilityState !== 'hidden') return;
  const last = Number(sessionStorage.getItem(ENGINE_RELOAD_GUARD)) || null;
  const now = Date.now();
  if (!mayAutoReload(now, last)) return;
  sessionStorage.setItem(ENGINE_RELOAD_GUARD, String(now));
  void releaseEngine().then(() => window.location.reload());
}

/**
 * Tabs in a handover leave the reload to the service worker activation. A hidden tab reloading
 * ahead of it lands on the new build under the old service worker and gets reloaded again.
 */
export function markEngineStale(autoReload = true): void {
  engineStale.set(true);
  if (!autoReload) return;
  document.addEventListener('visibilitychange', reloadWhenHidden);
  reloadWhenHidden();
}
