// hooks/useNotificationStore.ts
import { apiGetNotificationsById } from "@/service/api-notifications";
import { createContext, ReactNode, useContext, useState, useEffect } from "react";
import { useAuth } from "./use-auth";

type AppNotification = {
  id: string;
  title: string;
  body: string;
  data?: Record<string, string>;
  isRead: boolean;
  timestamp: number;
  type: "notification" | "trigger";
  appId?: string;
  kategoriApp?:
    | "JOB"
    | "VOTING"
    | "EVENT"
    | "DONASI"
    | "INVESTASI"
    | "COLLABORATION"
    | "FORUM"
    | "ACCESS";
};

type NotificationContextType = {
  notifications: AppNotification[];
  unreadCount: number;
  addNotification: (
    notif: Omit<AppNotification, "id" | "isRead" | "timestamp">
  ) => void;
  markAsRead: (id: string) => void;
  syncUnreadCount: () => Promise<void>;
};

const NotificationContext = createContext<NotificationContextType>({
  notifications: [],
  unreadCount: 0,
  addNotification: () => {},
  markAsRead: () => {},
  syncUnreadCount: async () => {},
});

export const NotificationProvider = ({ children }: { children: ReactNode }) => {
  const {user} = useAuth()
  const [notifications, setNotifications] = useState<AppNotification[]>([]);
  const [unreadCount, setUnreadCount] = useState(0);

  // 🔔 Sync unread count dari backend saat provider di-mount
  useEffect(() => {
    const fetchUnreadCount = async () => {
      try {
        const count = await apiGetNotificationsById({
          id: user?.id as any,
          category: "count-as-unread"
        }); // ← harus return number
        const result = count.data
        setUnreadCount(result);
      } catch (error) {
        console.erro("⚠️ Gagal fetch unread count:", error);
      }
    };

    fetchUnreadCount();
  }, []);

  const addNotification = (
    notif: Omit<AppNotification, "id" | "isRead" | "timestamp">
  ) => {
    setNotifications((prev) => [
      {
        ...notif,
        id: Date.now().toString(),
        isRead: false,
        timestamp: Date.now(),
      },
      ...prev,
    ]);
    // Tambahkan ke unread count (untuk notifikasi foreground)
    setUnreadCount((prev) => prev + 1);
  };

  const markAsRead = (id: string) => {
    setNotifications((prev) =>
      prev.map((n) => (n.id === id ? { ...n, isRead: true } : n))
    );
    // Kurangi unread count
    setUnreadCount((prev) => Math.max(0, prev - 1));
  };

  const syncUnreadCount = async () => {
    try {
        const count = await apiGetNotificationsById({
          id: user?.id as any,
          category: "count-as-unread"
        }); // ← harus return number
        const result = count.data
        setUnreadCount(result);
    } catch (error) {
      console.warn("⚠️ Gagal sync unread count:", error);
    }
  };

  return (
    <NotificationContext.Provider
      value={{ notifications, unreadCount, addNotification, markAsRead, syncUnreadCount }}
    >
      {children}
    </NotificationContext.Provider>
  );
};

export const useNotificationStore = () => useContext(NotificationContext);