import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import type { NotificationCreationData, NotificationUpdateData } from '../entities/Notification';
import { NotificationService } from '../services/NotificationService';
import type { NotificationPort } from '../ports/NotificationPort';

const QUERY_KEYS = {
  all: ['notification'] as const,
  lists: () => [...QUERY_KEYS.all, 'list'] as const,
  list: (filters: string) => [...QUERY_KEYS.lists(), { filters }] as const,
  details: () => [...QUERY_KEYS.all, 'detail'] as const,
  detail: (id: string) => [...QUERY_KEYS.details(), id] as const,
};

export function useNotificationService(port: NotificationPort) {
  return new NotificationService(port);
}

export function useNotificationList(port: NotificationPort) {
  const service = useNotificationService(port);
  return useQuery({
    queryKey: QUERY_KEYS.lists(),
    queryFn: () => service.getAll(),
  });
}

export function useNotificationDetail(port: NotificationPort, id: string) {
  const service = useNotificationService(port);
  return useQuery({
    queryKey: QUERY_KEYS.detail(id),
    queryFn: () => service.getById(id),
    enabled: !!id,
  });
}

export function useNotificationCreate(port: NotificationPort) {
  const queryClient = useQueryClient();
  const service = useNotificationService(port);
  return useMutation({
    mutationFn: (data: NotificationCreationData) => service.create(data),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() });
    },
  });
}

export function useNotificationUpdate(port: NotificationPort) {
  const queryClient = useQueryClient();
  const service = useNotificationService(port);
  return useMutation({
    mutationFn: ({ id, data }: { id: string; data: NotificationUpdateData }) =>
      service.update(id, data),
    onSuccess: (_, { id }) => {
      queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() });
      queryClient.invalidateQueries({ queryKey: QUERY_KEYS.detail(id) });
    },
  });
}

export function useNotificationDelete(port: NotificationPort) {
  const queryClient = useQueryClient();
  const service = useNotificationService(port);
  return useMutation({
    mutationFn: (id: string) => service.delete(id),
    onSuccess: (_, id) => {
      queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() });
      queryClient.invalidateQueries({ queryKey: QUERY_KEYS.detail(id) });
    },
  });
}