import { getToken } from "firebase/messaging";
import { getFirebaseMessaging } from "@/lib/firebase";

export const getDeviceToken = async (): Promise<string | null> => {
  try {
    if (typeof window === "undefined") return null;

    const messaging = await getFirebaseMessaging();
    if (!messaging) return null;

    const vapidKey = process.env.NEXT_PUBLIC_FIREBASE_WEB_PUSH_VAPID_KEY;
    if (!vapidKey) {
      console.warn("Missing VAPID key.");
      return null;
    }

    const token = await getToken(messaging, {
      vapidKey,
    });

    return token;
  } catch (error) {
    console.error("Failed to get device token", error);
    return null;
  }
};

/**
 * Generates FCM token at login time: registers SW then gets token.
 * No notification permission check — always attempts to generate and return token on login.
 * Call this when the user submits login so the token is always sent with sign-in.
 */
export const getFcmTokenForLogin = async (): Promise<string | null> => {
  try {
    if (typeof window === "undefined" || !("serviceWorker" in navigator))
      return null;

    const registration = await navigator.serviceWorker.register(
      "/firebase-messaging-sw.js"
    );
    await registration.ready;

    const token = await getDeviceToken();
    if (token) localStorage.setItem("fcmToken", token);
    return token;
  } catch (error) {
    console.warn("FCM token for login failed:", error);
    return null;
  }
};
