import { AxiosError, AxiosInstance, InternalAxiosRequestConfig } from "axios";

const TOKEN_KEY = "@embrapa-idh:token";
const USER_KEY = "@embrapa-idh:user";

const clearAuthAndRedirect = () => {
  if (typeof window !== "undefined") {
    localStorage.removeItem(TOKEN_KEY);
    localStorage.removeItem(USER_KEY);

    setTimeout(() => {
      window.location.href = "/login";
    }, 100);
  }
};

export function isDuplicateKeyError(data: unknown): boolean {
  if (!data) return false;
  const text = typeof data === "string" ? data : JSON.stringify(data);
  return /duplicate key/i.test(text);
}

export function setupInterceptors(api: AxiosInstance) {
  api.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
      if (typeof window !== "undefined") {
        const token = localStorage.getItem(TOKEN_KEY);
        if (token && config.headers) {
          config.headers.Authorization = `Bearer ${token}`;
        }
      }
      return config;
    },
    (error) => {
      return Promise.reject(error);
    }
  );

  api.interceptors.response.use(
    (response) => response,
    async (error: AxiosError) => {
      const isAuthRequest = error.config?.url?.includes("/autenticar");

      if (
        error.response?.status === 401 &&
        !isAuthRequest &&
        !isDuplicateKeyError(error.response?.data)
      ) {
        clearAuthAndRedirect();
      }

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