import type { AxiosResponse } from "axios";
import { useQuery, type UseQueryResult } from "@tanstack/react-query";
import instance from "@/instance/instance";
import { toast } from "sonner";
import { ApiResponse, UseFetchDetailsProps } from "@/instance/instance.type";

function useFetchDetails<T>({
  url,
  id,
  queryOptions = {},
  enabled,
}: UseFetchDetailsProps<T>): UseQueryResult<T> {
  return useQuery({
    queryKey: [url, id],
    queryFn: async (): Promise<T> => {
      try {
        const headers: Record<string, string> = {};
        const response: AxiosResponse<ApiResponse<T>> = await instance.get<
          ApiResponse<T>
        >(`${url}${String(id)}`, {
          headers,
        });
        if (
          response?.data?.statusCode >= 200 &&
          response?.data?.statusCode < 300
        ) {
          return response.data.data;
        } else {
          const statusCode = response?.data?.statusCode ?? 500;
          if (statusCode >= 400 && statusCode < 500) {
            window.history.back();
          }
          throw new Error(
            response?.data?.message ?? "An unknown error occurred"
          );
        }
      } catch (error: unknown) {
        if (error instanceof Error) {
          toast.error(error.message || "An unexpected error occurred.");
          console.error(error.message || "An unexpected error occurred.");
        } else {
          console.error("An unknown error occurred.");
        }

        throw error;
      }
    },
    enabled: enabled ?? !!id,
    retry: 1,
    refetchOnWindowFocus: false,
    // Detail responses were previously uncacheable, so every back-navigation
    // refetched from scratch.
    staleTime: 30 * 1000,
    gcTime: 5 * 60 * 1000,
    ...queryOptions,
  });
}

export default useFetchDetails;
