import { useMutation, useQuery } from "@tanstack/react-query"
import { createNewOffer, fetchOffers, fetchOfferById, updateOffer, deleteOffer, getOffers, getOfferById, fetchOffersByClientId, getClientOffers } from "../queries/offers"
import type { CreateOfferPayload, OffersResponse, ClientOffersResponse } from "@/types/offers"
import { useToaster } from "@/context/ToasterContext"
import { queryClient } from "../client"

export function useGetOffersByClientId(clientId: string) {
  return useQuery<ClientOffersResponse>({
    queryKey: getClientOffers(clientId),
    queryFn: () => fetchOffersByClientId(clientId),
    enabled: !!clientId
  })
}

export function useCreateOffer() {
  const toast = useToaster()

  return useMutation({
    mutationFn: (payload: CreateOfferPayload) => createNewOffer(payload),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Offer created successfully!")
      queryClient.invalidateQueries({ queryKey: getOffers })
    },
    onError: error => {
      toast.showError("Failed to create offer. Please try again.")
    }
  })
}

export function useGetOffers() {
  return useQuery<OffersResponse>({
    queryKey: getOffers,
    queryFn: () => fetchOffers()
  })
}

export function useGetOfferById(id: string) {
  return useQuery({
    queryKey: getOfferById(id),
    queryFn: () => fetchOfferById(id),
    enabled: !!id
  })
}

export function useUpdateOffer() {
  const toast = useToaster()

  return useMutation({
    mutationFn: ({ id, payload }: { id: string; payload: Partial<CreateOfferPayload> }) => updateOffer(id, payload),
    onSuccess: (data, { id }) => {
      toast.showSuccess(data?.message || "Offer updated successfully!")
      queryClient.invalidateQueries({ queryKey: getOffers })
      queryClient.invalidateQueries({ queryKey: getOfferById(id) })
    },
    onError: error => {
      console.error("Offer update failed:", error)
      toast.showError("Failed to update offer. Please try again.")
    }
  })
}

export function useDeleteOffer() {
  const toast = useToaster()

  return useMutation({
    mutationFn: (id: string) => deleteOffer(id),
    onSuccess: (data, id) => {
      toast.showSuccess(data?.message || "Offer deleted successfully!")
      queryClient.invalidateQueries({ queryKey: getOffers })
      queryClient.invalidateQueries({ queryKey: getOfferById(id) })
    },
    onError: error => {
      console.error("Offer deletion failed:", error)
      toast.showError("Failed to delete offer. Please try again.")
    }
  })
}
