"use client";

import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import {
  notificationControllerGetNotificationsV1,
  notificationControllerGetUnreadCountV1,
  notificationControllerMarkAsReadV1,
  notificationControllerMarkAllAsReadV1,
  notificationControllerDeleteNotificationV1,
} from "@/api/user/individual-notifications/individual-notifications";
import type { NotificationControllerGetNotificationsV1Params } from "@/api/user/generated.schemas";

const INDIVIDUAL_NOTIFICATIONS_KEY = "individual-notifications";
const INDIVIDUAL_UNREAD_COUNT_KEY = "individual-notifications-unread-count";
const POLLING_INTERVAL = 30000; // 30 seconds

interface UseIndividualNotificationsOptions {
  enabled?: boolean;
  params?: NotificationControllerGetNotificationsV1Params;
  enablePolling?: boolean;
}

export const useIndividualNotifications = (options: UseIndividualNotificationsOptions = {}) => {
  const { enabled = true, params, enablePolling = true } = options;
  const queryClient = useQueryClient();

  // Fetch notifications list
  const notificationsQuery = useQuery<any>({
    queryKey: [INDIVIDUAL_NOTIFICATIONS_KEY, params],
    queryFn: () => notificationControllerGetNotificationsV1(params),
    enabled,
    refetchInterval: enablePolling ? POLLING_INTERVAL : false,
    staleTime: 10000,
    retry: 1,
    retryDelay: 1000,
    gcTime: 60000,
  });

  // Fetch unread count (lighter endpoint for badge)
  const unreadCountQuery = useQuery<any>({
    queryKey: [INDIVIDUAL_UNREAD_COUNT_KEY],
    queryFn: () => notificationControllerGetUnreadCountV1(),
    enabled,
    refetchInterval: enablePolling ? POLLING_INTERVAL : false,
    staleTime: 10000,
    retry: 1,
    retryDelay: 1000,
    gcTime: 60000,
  });

  // Mark single notification as read
  const markAsReadMutation = useMutation({
    mutationFn: (uuid: string) => notificationControllerMarkAsReadV1(uuid),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: [INDIVIDUAL_NOTIFICATIONS_KEY] });
      queryClient.invalidateQueries({ queryKey: [INDIVIDUAL_UNREAD_COUNT_KEY] });
    },
  });

  // Mark all notifications as read
  const markAllAsReadMutation = useMutation({
    mutationFn: () => notificationControllerMarkAllAsReadV1(),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: [INDIVIDUAL_NOTIFICATIONS_KEY] });
      queryClient.invalidateQueries({ queryKey: [INDIVIDUAL_UNREAD_COUNT_KEY] });
    },
  });

  // Delete notification
  const deleteMutation = useMutation({
    mutationFn: (uuid: string) => notificationControllerDeleteNotificationV1(uuid),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: [INDIVIDUAL_NOTIFICATIONS_KEY] });
      queryClient.invalidateQueries({ queryKey: [INDIVIDUAL_UNREAD_COUNT_KEY] });
    },
  });

  return {
    // Data
    notifications: notificationsQuery.data?.data?.notifications || [],
    unreadCount: unreadCountQuery.data?.data?.unread_count || 0,
    totalCount: notificationsQuery.data?.data?.total_count || 0,
    totalPages: notificationsQuery.data?.data?.total_pages || 1,
    currentPage: notificationsQuery.data?.data?.page || 1,

    // Loading states
    isLoading: notificationsQuery.isLoading,
    isFetching: notificationsQuery.isFetching,
    isError: notificationsQuery.isError,

    // Actions
    markAsRead: markAsReadMutation.mutate,
    markAllAsRead: markAllAsReadMutation.mutate,
    deleteNotification: deleteMutation.mutate,

    // Mutation states
    isMarkingAsRead: markAsReadMutation.isPending,
    isMarkingAllAsRead: markAllAsReadMutation.isPending,
    isDeleting: deleteMutation.isPending,

    // Refetch
    refetch: () => {
      notificationsQuery.refetch();
      unreadCountQuery.refetch();
    },
  };
};

// Hook for dropdown (limited notifications, with polling)
export const useIndividualNotificationDropdown = (enabled = true) => {
  return useIndividualNotifications({
    enabled,
    params: { limit: 5 },
    enablePolling: true,
  });
};

// Hook for full notifications page (no polling, more items)
export const useIndividualNotificationPage = (params?: NotificationControllerGetNotificationsV1Params) => {
  return useIndividualNotifications({
    enabled: true,
    params: { ...params, limit: params?.limit || 50 },
    enablePolling: false,
  });
};

// Type aliases for backward compatibility
export type IndividualNotificationParams = NotificationControllerGetNotificationsV1Params;

// Notification type for UI
export type IndividualNotificationType = 'screening' | 'support' | 'subscription' | 'payment' | 'system';

// Notification interface for UI
export interface IndividualNotification {
  uuid: string;
  type: IndividualNotificationType;
  title: string;
  message: string;
  is_read: boolean;
  created_at: string;
  reference_id?: string;
  reference_type?: string;
  data?: Record<string, unknown>;
}
