import * as env from "../config/env.config";
import { FirebaseService } from "../services/firebase.service";
import { NotificationPayload } from "./interfaces/notification.interface";

/**
 * Envía una notificación push a un dispositivo específico usando Firebase Cloud Messaging (FCM).
 *
 * Si `FCM_ENABLED` está desactivado en el entorno, la función retorna inmediatamente
 * sin enviar nada. Los campos opcionales `imageUrl` y `link` se incluyen en el
 * payload de datos si se proporcionan.
 *
 * @param token - Token FCM del dispositivo destino
 * @param title - Título de la notificación push
 * @param body - Cuerpo/mensaje de la notificación push
 * @param imageUrl - URL de imagen a mostrar en la notificación (opcional)
 * @param link - URL de destino al hacer clic en la notificación (opcional)
 * @returns Objeto con `success: true` e `id` del mensaje si fue exitoso,
 *          o `success: false` con `errorCode` y `errorMessage` en caso de fallo
 */
export async function sendPush(
  token: string,
  title: string,
  body: string,
  imageUrl?: string | null,
  link?: string | null,
) {
  if (!env.FCM_ENABLED) return { success: false, error: "FCM disabled" };

  const payload: NotificationPayload = {
    title,
    body,
    data: {},
  };

  if (imageUrl) {
    (payload.data as Record<string, string>).imageUrl = String(imageUrl);
  }
  if (link) {
    (payload.data as Record<string, string>).link = String(link);
  }

  try {
    const id = await FirebaseService.getInstance().sendToDevice(token, payload);
    console.log("🚀 ~ id:", id);
    return { success: true, id };
  } catch (error: any) {
    // Normalize error response with errorCode and errorMessage
    const errorCode = error?.code || null;
    const errorMessage =
      error?.message || String(error) || "Unknown error occurred";

    return {
      success: false,
      errorCode,
      errorMessage,
      error, // Keep original error for backward compatibility
    };
  }
}
