import {
  useMutation,
  useQueryClient,
  type UseMutationOptions,
} from "@tanstack/react-query";
import instance from "@/instance/instance";
import { toast } from "sonner";
import { ApiError } from "next/dist/server/api-utils";
import { ApiResponse } from "@/instance/instance.type";

interface UsePostDataProps<TData, TVariables> {
  useFormData?: boolean;
  showToast?: boolean;
  url: string;
  mutationOptions?: UseMutationOptions<TData, ApiError, TVariables>;
  headers?: Record<string, string>;
  refetchQueries?: string[];
  onSuccess?: (data: TData) => void;
  onError?: (error: ApiError) => void;
}

const usePostData = <TData = unknown, TVariables = unknown>({
  useFormData = false,
  showToast = true,
  url,
  mutationOptions,
  headers = {},
  refetchQueries,
  onSuccess = () => {},
  // onError = () => {},
}: UsePostDataProps<TData, TVariables>) => {
  const queryClient = useQueryClient();

  return useMutation<TData, ApiError, TVariables>({
    mutationFn: async (variables: TVariables): Promise<TData> => {
      const finalHeaders: Record<string, string> = {
        ...headers,
        ...(useFormData ? { "Content-Type": "multipart/form-data" } : {}),
      };
      // eslint-disable-next-line @typescript-eslint/no-explicit-any
      const payload: any = variables;

      const response = await instance.post<ApiResponse<TData>>(url, payload, {
        headers: finalHeaders,
      });
      if (!response.data?.error) {
        const { statusCode, message, data } = response.data;

        if (statusCode === 200 || statusCode === 201) {
          if (showToast) {
            toast.success(message || "Data posted successfully");
          }
          return data;
        }
      }

      throw new Error(response.data?.message || "Request failed.");
    },

    onSuccess: async (data: TData) => {
      if (refetchQueries) {
        await Promise.all(
          refetchQueries?.map((queryKey) =>
            queryClient.refetchQueries({ queryKey: [queryKey] })
          )
        );
      }
      onSuccess(data);
    },
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    onError: async (error: any) => {
      const errorMessage =
        error?.response?.data?.message?.message ??
        error?.response?.data?.message ??
        error?.response?.message ??
        "Something went wrong!";

      toast.error(errorMessage);
    },
    ...mutationOptions,
  });
};

export default usePostData;
