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

type AppNotification = {
  id: string;
  title: string;
  body: string;
  data?: Record<string, string>;
  isRead: boolean;
  timestamp: number;
  type: "announcement" | "trigger";
  // untuk id dari setiap kategori app
  appId?: string;
  kategoriApp?:
    | "JOB"
    | "VOTING"
    | "EVENT"
    | "DONASI"
    | "INVESTASI"
    | "COLLABORATION"
    | "FORUM"
    | "ACCESS"; // Untuk trigger akses user;
};

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

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

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

  console.log(
    "🚀 Notifications Masuk:",
    JSON.stringify(notifications, null, 2)
  );

  // Sync unread count dari backend saat provider di-mount
  useEffect(() => {
    fetchUnreadCount();
  }, [user?.id]);

  const fetchUnreadCount = async () => {
    try {
      const count = await apiNotificationUnreadCount({
        id: user?.id as any,
        role: user?.masterUserRoleId as any,
      }); // ← harus return number
      const result = count.data;
      console.log("📖 Unread count:", result);
      setUnreadCount(result);
    } catch (error) {
      console.error("Gagal fetch unread count:", error);
    }
  };

  const addNotification = (
    notif: Omit<AppNotification, "id" | "isRead" | "timestamp">
  ) => {
    setNotifications((prev) => [
      {
        ...notif,
        id: Date.now().toString(),
        isRead: false,
        timestamp: Date.now(),
      },
      ...prev,
    ]);

    setUnreadCount((prev) => prev + 1);
  };

  const markAsRead = async (id: string) => {
    try {
      const response = await apiNotificationMarkAsRead({ id, category: "one" });
      console.log("🚀 Response Mark As Read:", response);

      if (response.success) {
        const cloneNotifications = [...notifications];
        const index = cloneNotifications.findIndex((n) => n?.data?.id === id);
        if (index !== -1) {
          cloneNotifications[index].isRead = true;
          setNotifications(cloneNotifications);
        }
      }
    } catch (error) {
      console.error("Gagal mark as read:", error);
    }
  };

  const markAsReadAll = async (id: string) => {
    try {
      const response = await apiNotificationMarkAsRead({ id, category: "all" });
      console.log("🚀 Response Mark As Read All:", response);

      if (response.success) {
        const cloneNotifications = [...notifications];
        const index = cloneNotifications.findIndex((n) => n?.data?.id === id);
        if (index !== -1) {
          cloneNotifications[index].isRead = true;
          setNotifications(cloneNotifications);
        }
      }
    } catch (error) {
      console.error("Gagal mark as read:", error);
    }
  };


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

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

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