import { pushApi } from '@/api/push';

/**
 * 푸시 알림 초기화 (config-gated).
 *
 * 활성 조건: 빌드 환경변수 `VITE_FCM_*` 가 모두 설정된 경우에만 동작한다.
 * 미설정 시 no-op (개발/미연동 환경에서 안전).
 *
 * firebase SDK 통합 완료 — 활성 조건은 `.env(.local)` 의 VITE_FCM_* 주입뿐이다.
 *   1) Firebase 콘솔 → 웹 앱 등록 → 설정값을 .env.local 의 VITE_FCM_* 로 주입
 *   2) getToken(VAPID key)으로 FCM 토큰 발급 → pushApi.register(token) 자동 호출
 *   3) public/firebase-messaging-sw.js 가 백그라운드 수신 처리
 *
 * 서버측(PushAdapter=fcm + FCM_PROJECT_ID/FCM_ACCESS_TOKEN)과 함께 활성화해야 실제 발송된다.
 */
export async function initPush(): Promise<void> {
  const cfg = {
    apiKey: import.meta.env.VITE_FCM_API_KEY,
    projectId: import.meta.env.VITE_FCM_PROJECT_ID,
    appId: import.meta.env.VITE_FCM_APP_ID,
    messagingSenderId: import.meta.env.VITE_FCM_SENDER_ID,
    vapidKey: import.meta.env.VITE_FCM_VAPID_KEY,
  };

  // 환경변수 미설정 → 푸시 비활성 (no-op)
  if (!cfg.apiKey || !cfg.projectId || !cfg.appId || !cfg.vapidKey) {
    if (import.meta.env.DEV) {
      // eslint-disable-next-line no-console
      console.info('[push] VITE_FCM_* 미설정 — 푸시 비활성(서버는 mock).');
    }
    return;
  }

  if (!('serviceWorker' in navigator) || !('Notification' in window)) return;

  try {
    const permission = await Notification.requestPermission();
    if (permission !== 'granted') return;

    const { isSupported, getMessaging, getToken } = await import('firebase/messaging');
    if (!(await isSupported())) {
      if (import.meta.env.DEV) console.info('[push] 이 브라우저는 FCM 미지원 — skip.');
      return;
    }

    const { initializeApp, getApps } = await import('firebase/app');
    const appFb = getApps().length
      ? getApps()[0]
      : initializeApp({
          apiKey: cfg.apiKey,
          projectId: cfg.projectId,
          appId: cfg.appId,
          messagingSenderId: cfg.messagingSenderId,
        });

    // FCM 백그라운드 수신용 서비스워커 (vite-plugin-pwa SW 와 별개).
    // 웹 config 는 정적 SW 파일에 박지 않고 쿼리스트링으로 전달.
    const swQuery = new URLSearchParams({
      apiKey: cfg.apiKey,
      projectId: cfg.projectId,
      appId: cfg.appId,
      messagingSenderId: cfg.messagingSenderId ?? '',
    }).toString();
    const swReg = await navigator.serviceWorker.register(`/firebase-messaging-sw.js?${swQuery}`);

    const messaging = getMessaging(appFb);
    const token = await getToken(messaging, {
      vapidKey: cfg.vapidKey,
      serviceWorkerRegistration: swReg,
    });
    if (token) await pushApi.register(token, 'WEB');
  } catch (e) {
    if (import.meta.env.DEV) console.warn('[push] init 실패', e);
  }
}
