import { Capacitor } from "@capacitor/core";
import { PushNotifications } from "@capacitor/push-notifications";
import { registerDeviceToken, removeDeviceToken } from "src/api/deviceToken";
import { userStore } from "src/stores/user";

// Token FCM do dispositivo, capturado pelo listener "registration" do boot.
// Fica em escopo de módulo para continuar acessível no logout.
let deviceToken = null;

export const usePushNotifications = () => {
  const isSupported = () => Capacitor.isNativePlatform();

  const setDeviceToken = (token) => {
    deviceToken = token;
  };

  /**
   * Envia o token do dispositivo para a API.
   * Só faz sentido autenticado: sem access token o POST volta 401, o
   * dispositivo fica sem push e o interceptor ainda tenta um refresh à toa.
   */
  const syncDeviceToken = async () => {
    if (!isSupported() || !deviceToken || !userStore().accessToken) {
      return;
    }

    try {
      await registerDeviceToken(deviceToken, Capacitor.getPlatform());
    } catch {
      // falha silenciosa — não bloqueia o uso do app
    }
  };

  /**
   * Desativa o token na API para o dispositivo parar de receber push
   * depois que o usuário sai da conta.
   */
  const unregisterDeviceToken = async () => {
    if (!isSupported() || !deviceToken || !userStore().accessToken) {
      return;
    }

    try {
      await removeDeviceToken(deviceToken);
    } catch {
      // falha silenciosa — não pode impedir o logout
    }
  };

  /**
   * Solicita a permissão de notificações e registra o app no FCM,
   * o que dispara o listener "registration" configurado no boot.
   */
  const requestPermissionAndRegister = async () => {
    if (!isSupported()) {
      return;
    }

    let permission = await PushNotifications.checkPermissions();

    if (permission.receive === "prompt") {
      permission = await PushNotifications.requestPermissions();
    }

    if (permission.receive !== "granted") {
      return;
    }

    await PushNotifications.register();
  };

  return {
    isSupported,
    requestPermissionAndRegister,
    setDeviceToken,
    syncDeviceToken,
    unregisterDeviceToken,
  };
};
