import { useQuery, type UseQueryResult } from "@tanstack/react-query";
import instance from "@/instance/instance";
import { ApiResponse, UseFetchDataProps } from "@/instance/instance.type";
import { buildQueryString } from "@/lib/common-function";

function useFetchData<T>({
  url,
  params = {},
  queryOptions = {},
  enabled = true,
  staleTime,
}: UseFetchDataProps<T>): UseQueryResult<T> {
  return useQuery({
    queryKey: [url, params],
    queryFn: async () => {
      const queryString = buildQueryString(params);
      const headers: Record<string, string> = {};

      const response = await instance.get<ApiResponse<T>>(
        `${url}${queryString}`,
        { headers }
      );
      if (
        response?.data?.statusCode === 200 ||
        response?.data?.statusCode === 202
      ) {
        return response.data.data;
      }
      throw new Error(response?.data?.message ?? "Failed to fetch data");
    },
    retry: 1,
    refetchOnWindowFocus: false,
    enabled: enabled,
    ...(staleTime !== undefined ? { staleTime } : {}),
    ...queryOptions,
  });
}

export default useFetchData;
