'use client';
import { useEffect } from 'react';

const API = process.env.NEXT_PUBLIC_API_URL?.replace('/api', '') ?? 'http://localhost:3007';
const VAPID_PUBLIC_KEY = process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? '';

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

export function usePushNotifications() {
  useEffect(() => {
    const setup = async () => {
      try {
        if (typeof window === 'undefined') return;
        if (!('serviceWorker' in navigator) || !('PushManager' in window)) {
          console.warn('[push] not supported in this browser');
          return;
        }
        const token = localStorage.getItem('access_token');
        if (!token) return; // only subscribe while logged in — but the sub itself survives logout

        // 1. Register SW
        const reg = await navigator.serviceWorker.register('/sw.js');
        await navigator.serviceWorker.ready;

        // 2. Ask permission
        let perm = Notification.permission;
        if (perm === 'default') perm = await Notification.requestPermission();
        if (perm !== 'granted') { console.warn('[push] permission denied'); return; }

        // 3. Subscribe (or reuse)
        let sub = await reg.pushManager.getSubscription();
        if (!sub) {
          if (!VAPID_PUBLIC_KEY) { console.error('[push] missing NEXT_PUBLIC_VAPID_PUBLIC_KEY'); return; }
          sub = await reg.pushManager.subscribe({
            userVisibleOnly: true,
            applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY),
          });
        }

        // 4. Send to backend (tied to userId via JWT)
        await fetch(`${API}/api/chat/push/subscribe`, {
          method: 'POST',
          headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
          body: JSON.stringify(sub),
        });

        console.log('[push] subscribed ✓');
      } catch (err) {
        console.error('[push] setup failed', err);
      }
    };
    setup();
  }, []);
}