import axios from "axios";
import { alert } from "~/composables/use-toast";

declare module "axios" {
  interface AxiosRequestConfig {
    suppressAlert?: boolean;
  }
}

export default defineNuxtPlugin(() => {
  const tokenName = useRuntimeConfig().public.AUTH_TOKEN;
  const axiosInstance = axios.create({
    // timeout removed to allow backend to handle timeouts
    baseURL: "/", // api calls already pass with /api
    withCredentials: true,
  });

  axiosInstance.interceptors.request.use(
    (config) => {
      const token = useCookie(tokenName).value;
      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
      return config;
    },
    (error) => {
      return Promise.reject(error);
    },
  );

  // Add response interceptor
  axiosInstance.interceptors.response.use(
    (response) => {
      if (response?.data?.message && !response.config?.suppressAlert) alert.info(response.data.message as string);
      return response;
    },
    (error) => {
      if (error?.response?.data?.detail?.message) {
        alert.error(error.response.data.detail.message as string);
      };

      // If we receive a 401 Unauthorized response, clear the token cookie and redirect to login
      if (error?.response?.status === 401) {
        // If tokenCookie is not set, we may just be an unauthenticated user using the wrong API, so don't redirect
        const tokenCookie = useCookie(tokenName);
        if (tokenCookie.value) {
          tokenCookie.value = null;

          // Disable beforeunload warnings to prevent "Are you sure you want to leave?" popups
          window.onbeforeunload = null;
          window.location.href = "/login";
        }
      }

      return Promise.reject(error);
    },
  );

  return {
    provide: {
      axios: axiosInstance,
    },
  };
});
