"use client"
import { useMutation, useQuery } from "@tanstack/react-query"
import {
  createService,
  createNewService,
  fetchServices,
  getServices,
  getCategorizedServices,
  removeService,
  updateService,
  getServiceById,
  getServiceDetails,
  createCategory,
  createNewCategory,
  getCategories,
  fetchCategories,
  fetchCategorizedServices,
  updateCategory,
  deleteCategory,
  duplicateService
} from "../queries/services"
import type { CreateServicePayload, ServicesResponse, CreateCategoryPayload, Category, CategoryWithServices, CategorizedServicesResponse } from "@/types/services"
import { useToaster } from "@/context/ToasterContext"
import { useRouter } from "next/navigation"
import { queryClient } from "../client"


export function useDuplicateService() {
  const toast = useToaster()
  return useMutation({
    mutationFn: (id: string) => duplicateService(id),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Service duplicated successfully!")
      queryClient.invalidateQueries({ queryKey: getCategorizedServices })
    },
    onError: error => {
      console.error("Service duplication failed:", error)
      toast.showError("Failed to duplicate service. Please try again.")
    }
  })
}

export function useCreateService() {
  const toast = useToaster()
  const router = useRouter()
  return useMutation({
    mutationKey: createService,
    mutationFn: (payload: CreateServicePayload) => createNewService(payload),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Service created successfully!")
      queryClient.invalidateQueries({ queryKey: getServices })
      queryClient.invalidateQueries({ queryKey: getCategorizedServices })
      router.push("/dashboard/services")
    },
    onError: error => {
      console.error("Service creation failed:", error)
      toast.showError("Failed to create service. Please try again.")
    }
  })
}

export function useGetServices(params?: any) {
  return useQuery<ServicesResponse>({
    queryKey: params ? [...getServices, params] : getServices,
    queryFn: () => fetchServices(params),
    refetchOnWindowFocus: false
  })
}

export function useGetCategorizedServices(params?: { page?: number; limit?: number }) {
  return useQuery<CategorizedServicesResponse>({
    queryKey: [...getCategorizedServices, params],
    queryFn: () => fetchCategorizedServices(params),
    refetchOnWindowFocus: false
  })
}

export function useDeleteService() {
  const toast = useToaster()
  return useMutation({
    mutationFn: (id: string) => removeService(id),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Service deleted successfully!")
      queryClient.invalidateQueries({ queryKey: getServices })
      queryClient.invalidateQueries({ queryKey: getCategorizedServices })
    },
    onError: error => {
      console.error("Service deletion failed:", error)
      toast.showError("Failed to delete service. Please try again.")
    }
  })
}

export function useUpdateService() {
  const toast = useToaster()
  const router = useRouter()
  return useMutation({
    mutationFn: ({ id, payload }: { id: string; payload: CreateServicePayload }) => updateService(id, payload),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Service updated successfully!")
      queryClient.invalidateQueries({ queryKey: getServiceById(data._id) })
      queryClient.invalidateQueries({ queryKey: getCategorizedServices })
      router.push("/dashboard/services")
    },
    onError: error => {
      console.error("Service update failed:", error)
      toast.showError("Failed to update service. Please try again.")
    }
  })
}

export function useGetServiceById(id: string) {
  return useQuery({
    queryKey: getServiceById(id),
    queryFn: () => getServiceDetails(id),
    enabled: !!id,
    refetchOnWindowFocus: false,
    refetchOnMount: true
  })
}

export function useCreateCategory() {
  const toast = useToaster()
  return useMutation({
    mutationKey: createCategory,
    mutationFn: (payload: CreateCategoryPayload) => createNewCategory(payload),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Category created successfully!")
      queryClient.invalidateQueries({ queryKey: getCategories })
    },
    onError: error => {
      console.error("Category creation failed:", error)
      toast.showError("Failed to create category. Please try again.")
    }
  })
}

export function useGetCategories() {
  return useQuery<Category[]>({
    queryKey: getCategories,
    queryFn: fetchCategories,
    refetchOnWindowFocus: false
  })
}

export function useUpdateCategory() {
  const toast = useToaster()
  return useMutation({
    mutationFn: ({ id, payload }: { id: string; payload: CreateCategoryPayload }) => updateCategory(id, payload),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Category updated successfully!")
      queryClient.invalidateQueries({ queryKey: getCategories })
      queryClient.invalidateQueries({ queryKey: getCategorizedServices })
    },
    onError: error => {
      console.error("Category update failed:", error)
      toast.showError("Failed to update category. Please try again.")
    }
  })
}

export function useDeleteCategory() {
  const toast = useToaster()
  return useMutation({
    mutationFn: (id: string) => deleteCategory(id),
    onSuccess: data => {
      toast.showSuccess(data?.message || "Category deleted successfully!")
      queryClient.invalidateQueries({ queryKey: getCategories })
      queryClient.invalidateQueries({ queryKey: getCategorizedServices })
    },
    onError: error => {
      console.error("Category deletion failed:", error)
      toast.showError("Failed to delete category. Please try again.")
    }
  })
}
