import axios from "axios";
import { useAuthStore } from "@/store/auth";

export const api = axios.create({
  baseURL: process.env.NEXT_PUBLIC_API_URL,
});

api.interceptors.request.use((config) => {
  const token = useAuthStore.getState().token;
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

// Instance à part, sans intercepteur, pour éviter que l'appel de rafraîchissement
// lui-même ne redéclenche la logique de retry en cas d'échec.
const apiSansIntercepteur = axios.create({
  baseURL: process.env.NEXT_PUBLIC_API_URL,
});

let rafraichissementEnCours: Promise<string> | null = null;

function deconnecterEtRediriger() {
  useAuthStore.getState().deconnecte();
  if (typeof window !== "undefined") {
    window.location.href = "/auth/connexion";
  }
}

api.interceptors.response.use(
  (response) => response,
  async (error) => {
    const requeteOriginale = error.config;

    if (error.response?.status !== 401 || requeteOriginale?._retry) {
      return Promise.reject(error);
    }

    const refreshToken = useAuthStore.getState().refreshToken;
    if (!refreshToken) {
      deconnecterEtRediriger();
      return Promise.reject(error);
    }

    requeteOriginale._retry = true;

    try {
      if (!rafraichissementEnCours) {
        rafraichissementEnCours = apiSansIntercepteur
          .post("/auth/refresh", { refreshToken })
          .then(({ data }) => {
            const user = useAuthStore.getState().user;
            useAuthStore.getState().connecte({
              token: data.token,
              refreshToken: data.refreshToken,
              user: user!,
            });
            return data.token as string;
          })
          .finally(() => {
            rafraichissementEnCours = null;
          });
      }

      const nouveauToken = await rafraichissementEnCours;
      requeteOriginale.headers.Authorization = `Bearer ${nouveauToken}`;
      return api(requeteOriginale);
    } catch {
      deconnecterEtRediriger();
      return Promise.reject(error);
    }
  },
);
