// push-notif.jsx — Helper subscribe / unsubscribe push notifications
// Exposé via window.AE_PUSH

(function () {
  const API = () => (window.AE_API && window.AE_API.BASE) || '';

  function urlBase64ToUint8Array(base64String) {
    const padding = '='.repeat((4 - base64String.length % 4) % 4);
    const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
    const rawData = window.atob(base64);
    const out = new Uint8Array(rawData.length);
    for (let i = 0; i < rawData.length; ++i) out[i] = rawData.charCodeAt(i);
    return out;
  }

  async function getPublicKey() {
    const r = await fetch(API() + '/api/push/vapid-public-key', { credentials: 'include' }).then(r => r.json()).catch(() => null);
    return r?.publicKey || null;
  }

  async function subscribe() {
    if (!('serviceWorker' in navigator) || !('PushManager' in window)) {
      return { ok: false, error: 'Push non supporté par ce navigateur' };
    }
    try {
      // Demande permission
      const perm = await Notification.requestPermission();
      if (perm !== 'granted') return { ok: false, error: 'Permission refusée' };

      const reg = await navigator.serviceWorker.ready;
      const publicKey = await getPublicKey();
      if (!publicKey) return { ok: false, error: 'VAPID non configuré côté serveur' };

      const sub = await reg.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: urlBase64ToUint8Array(publicKey),
      });

      const r = await fetch(API() + '/api/push/subscribe', {
        method: 'POST', credentials: 'include',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(sub),
      }).then(r => r.json());
      return r;
    } catch (e) {
      return { ok: false, error: e.message };
    }
  }

  async function unsubscribe() {
    if (!('serviceWorker' in navigator)) return { ok: false };
    const reg = await navigator.serviceWorker.ready;
    const sub = await reg.pushManager.getSubscription();
    if (!sub) return { ok: true, message: 'Pas de subscription' };
    await fetch(API() + '/api/push/unsubscribe', {
      method: 'POST', credentials: 'include',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ endpoint: sub.endpoint }),
    });
    await sub.unsubscribe();
    return { ok: true };
  }

  async function isSubscribed() {
    if (!('serviceWorker' in navigator)) return false;
    try {
      const reg = await navigator.serviceWorker.ready;
      const sub = await reg.pushManager.getSubscription();
      return !!sub;
    } catch (_) { return false; }
  }

  async function test() {
    const r = await fetch(API() + '/api/push/test', { method: 'POST', credentials: 'include' }).then(r => r.json());
    return r;
  }

  window.AE_PUSH = { subscribe, unsubscribe, isSubscribed, test };
})();
