import { useMutation, useQueryClient } from '@tanstack/react-query';
import {
  assignTicket,
  createTicketNote,
  createTicketReply,
  unassignTicket,
  updateTicket,
} from '@/features/tickets/services/ticketService';
import type {
  AssignTicketPayload,
  UpdateTicketPayload,
} from '@/features/tickets/types/ticket.types';
import { ticketQueryKey } from '@/features/tickets/hooks/useTicket';
import { ticketRepliesQueryKey } from '@/features/tickets/hooks/useTicketReplies';
import { ticketNotesQueryKey } from '@/features/tickets/hooks/useTicketNotes';
import { ticketSlaQueryKey } from '@/features/tickets/hooks/useTicketSla';
export function useTicketMutations(ticketId: string) {
  const queryClient = useQueryClient();

  const invalidateTicket = async () => {
    await Promise.all([
      queryClient.invalidateQueries({ queryKey: ticketQueryKey(ticketId) }),
      queryClient.invalidateQueries({ queryKey: ticketSlaQueryKey(ticketId) }),
      queryClient.invalidateQueries({ queryKey: ['tickets', 'list'] }),
    ]);
  };

  const updateTicketMutation = useMutation({
    mutationFn: (payload: UpdateTicketPayload) => updateTicket(ticketId, payload),
    onSuccess: invalidateTicket,
  });

  const assignTicketMutation = useMutation({
    mutationFn: (payload: AssignTicketPayload) => assignTicket(ticketId, payload),
    onSuccess: invalidateTicket,
  });

  const unassignTicketMutation = useMutation({
    mutationFn: () => unassignTicket(ticketId),
    onSuccess: invalidateTicket,
  });

  const createReplyMutation = useMutation({
    mutationFn: ({ content, attachments }: { content: string; attachments?: File[] }) =>
      createTicketReply(ticketId, content, attachments ?? []),
    onSuccess: async () => {
      await queryClient.invalidateQueries({ queryKey: ticketRepliesQueryKey(ticketId) });
      await invalidateTicket();
    },
  });

  const createNoteMutation = useMutation({
    mutationFn: (content: string) => createTicketNote(ticketId, content),
    onSuccess: async () => {
      await queryClient.invalidateQueries({ queryKey: ticketNotesQueryKey(ticketId) });
    },
  });

  return {
    updateTicketMutation,
    assignTicketMutation,
    unassignTicketMutation,
    createReplyMutation,
    createNoteMutation,
  };
}
