import { useMutation, UseMutationOptions } from "@tanstack/react-query";
import instance from "@/instance/instance";
import { toast } from "sonner";
import { ApiResponse, UpdateDataParams } from "@/instance/instance.type";

const usePutData = <TPayload = unknown, TData = unknown>({
  url,
  enabled = true,
  mutationOptions = {},
}: {
  url: string;
  enabled?: boolean;
  mutationOptions?: UseMutationOptions<
    TData,
    Error,
    UpdateDataParams<TPayload>
  >;
}) => {
  const mutation = useMutation<TData, Error, UpdateDataParams<TPayload>>({
    mutationFn: async ({ id, payload, headers }) => {
      const finalHeaders: Record<string, string> = {
        ...headers,
      };
      const finalPayload = payload;
      const response = await instance.put<ApiResponse<TData>>(
        `${url}${String(id)}`,
        finalPayload,
        {
          headers: finalHeaders,
        }
      );

      if (!response.data?.error) {
        toast.success(response?.data?.message || "Updated successfully.");
        return response.data?.data as TData;
      }

      throw new Error(response.data?.message || "Failed to update resource.");
    },
    ...mutationOptions,
    retry: false,
  });

  // If not enabled, return a disabled mutation-like object
  if (!enabled) {
    return {
      ...mutation,
      mutate: () => {},
      mutateAsync: async () => {},
      isLoading: false,
      isSuccess: false,
      isError: false,
      data: undefined,
      error: undefined,
      reset: mutation.reset,
      status: "idle",
    };
  }

  return mutation;
};

export default usePutData;
