import axios, { AxiosInstance, AxiosError } from "axios";
// import { AxiosRequestConfig } from "axios";
import axiosRetry, { IAxiosRetryConfig } from "axios-retry";

const getToken = (): string | null => {
  return localStorage.getItem("jobAdminJwtToken");
};

const useApiInterceptor = (): AxiosInstance => {
  const apiInstance = axios.create({
    baseURL: process.env.NEXT_PUBLIC_API_BASE_URL,
    headers: {
      Accept: "application/json",
      "Content-Type": "application/json",
    },
  });

  // Retry logic with exponential backoff
  const retryOptions: IAxiosRetryConfig = {
    retries: 3,
    retryCondition: (err: AxiosError<any>) => {
      return (
        axiosRetry.isNetworkOrIdempotentRequestError(err) ||
        err.response?.status === 429
      );
    },
    retryDelay: (retryCount: number, err: AxiosError<any>) => {
      if (err.response) {
        const retry_after = err.response.headers["retry-after"];
        if (retry_after) {
          return parseInt(retry_after, 10) * 1000;
        }
      }
      return axiosRetry.exponentialDelay(retryCount);
    },
  };

  axiosRetry(apiInstance, retryOptions);

  // Interceptor to add Authorization header conditionally
  apiInstance.interceptors.request.use((config) => {
    const token = getToken();
    if (token) {
      config.headers["Authorization"] = `Bearer ${token}`;
    }
    return config;
  });

  apiInstance.interceptors.response.use(
    (response) => response,
    (error: AxiosError) => {
      const isLoginPage = window.location.pathname === "/login";
      if (error.response?.status === 401 && !isLoginPage) {
        // Clear the token
        localStorage.removeItem("jobAdminJwtToken");
        // Redirect to login page
        window.location.href = "/logout?unauthorized=true";
      }
      return Promise.reject(error);
    },
  );

  return apiInstance;
};

export { useApiInterceptor };
