import { api } from "./api";

function urlBase64ToUint8Array(base64: string): BufferSource {
  const padding = "=".repeat((4 - (base64.length % 4)) % 4);
  const raw = atob(base64.replace(/-/g, "+").replace(/_/g, "/"));
  const output = new Uint8Array(raw.length);
  for (let i = 0; i < raw.length; i++) output[i] = raw.charCodeAt(i);
  return output;
}

/** Linux PWA / browser Web Push (VAPID). No-op in the Tauri shell — desktop
 * toasts go through the native notifier — and no-op until the user has
 * granted Notification permission (browsers refuse a prompt without a gesture). */
export async function registerWebPush(): Promise<void> {
  if (typeof window === "undefined") return;
  if ("__TAURI_INTERNALS__" in window) return;
  if (!("serviceWorker" in navigator) || !("PushManager" in window) || typeof Notification === "undefined") return;
  if (Notification.permission !== "granted") return;

  const registration = await navigator.serviceWorker.ready;
  const { publicKey } = await api.vapidPublicKey();
  if (!publicKey) return;

  const existing = await registration.pushManager.getSubscription();
  const subscription =
    existing ??
    (await registration.pushManager.subscribe({
      userVisibleOnly: true,
      applicationServerKey: urlBase64ToUint8Array(publicKey),
    }));
  const json = subscription.toJSON();
  if (!json.endpoint || !json.keys?.p256dh || !json.keys?.auth) return;
  await api.pushSubscribe({
    endpoint: json.endpoint,
    keys: { p256dh: json.keys.p256dh, auth: json.keys.auth },
    userAgent: navigator.userAgent,
  });
}
