import { useMutation, useQuery } from "@tanstack/react-query"
import {
  createNewStylist,
  fetchStylists,
  fetchStylistById,
  updateStylist,
  deleteStylist,
  uploadStylistImage,
  getStylists,
  getStylistById,
  getStylistsByService,
  addVacation,
  deleteVacation,
  fetchStylistsByService
} from "../queries/stylists"
import type { CreateStylistPayload, Stylist } from "@/types/stylists"
import { useToaster } from "@/context/ToasterContext"
import { queryClient } from "../client"

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

  return useMutation({
    mutationFn: (payload: CreateStylistPayload) => createNewStylist(payload),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Stylist created successfully!")
      queryClient.invalidateQueries({ queryKey: getStylists })
    },
    onError: error => {
      console.error("Stylist creation failed:", error)
      toast.showError("Failed to create stylist. Please try again.")
    }
  })
}

export function useGetStylists(filter: "all" | "active" | "offDuty" = "all") {
  return useQuery({
    queryKey: [...getStylists, filter],
    queryFn: () => fetchStylists(filter)
  })
}


export function useGetStylistById(id: string) {
  return useQuery({
    queryKey: getStylistById(id),
    queryFn: () => fetchStylistById(id),
    enabled: !!id
  })
}

export function useGetStylistsByService(serviceId: string) {
  return useQuery({
    queryKey: getStylistsByService(serviceId),
    queryFn: () => fetchStylistsByService(serviceId),
    enabled: !!serviceId
  })
}

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

  return useMutation({
    mutationFn: ({ id, payload }: { id: string; payload: Partial<CreateStylistPayload> }) => updateStylist(id, payload),
    onSuccess: (data, { id }) => {
      toast.showSuccess(data?.message || "Stylist updated successfully!")
      queryClient.invalidateQueries({ queryKey: getStylists })
      queryClient.invalidateQueries({ queryKey: getStylistById(id) })
    },
    onError: error => {
      console.error("Stylist update failed:", error)
      toast.showError("Failed to update stylist. Please try again.")
    }
  })
}

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

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

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

  return useMutation({
    mutationFn: ({ id, imageFile }: { id: string; imageFile: File }) => uploadStylistImage(id, imageFile),
    onSuccess: (data, { id }) => {
      toast.showSuccess(data?.message || "Profile image uploaded successfully!")
      queryClient.invalidateQueries({ queryKey: getStylists })
      queryClient.invalidateQueries({ queryKey: getStylistById(id) })
    },
    onError: error => {
      console.error("Image upload failed:", error)
      toast.showError("Failed to upload image. Please try again.")
    }
  })
}

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

  return useMutation({
    mutationFn: ({ id, payload }: { id: string; payload: any }) => addVacation(id, payload),
    onSuccess: (data, { id }) => {
      toast.showSuccess(data?.message || "Vacation added successfully!")
      queryClient.invalidateQueries({ queryKey: getStylistById(id) })
    },
    onError: (error: any) => {
      toast.showError(error?.response?.data?.message)
    }
  })
}

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

  return useMutation({
    mutationFn: (vacationId: string) => deleteVacation(vacationId),
    onSuccess: (data) => {
      toast.showSuccess(data?.message || "Vacation deleted successfully!")
      queryClient.invalidateQueries({ queryKey: getStylists })
      // Since we don't have the stylist ID here to invalidate specific query, we might rely on getStylists invalidation or require stylistId as param
      // Better approach: Invalidate all 'detail' queries or require stylistId.
      // Assuming invalidating 'stylists' list might not enough if details are cached separately by ID.
      // Let's invalidate all stylist details for safety
      queryClient.invalidateQueries({ queryKey: ["stylists", "detail"] })
    },
    onError: error => {
      console.error("Vacation deletion failed:", error)
      toast.showError("Failed to delete vacation. Please try again.")
    }
  })
}
