import axios from 'axios';

/**
 * Axios-Client mit automatischem Token-Handling.
 *
 * SICHERHEITSREGEL: Access-Token wird NUR im Memory gehalten (Variable).
 * Kein localStorage! Refresh-Token kommt als HttpOnly Cookie.
 */

// Access-Token im Memory (nicht localStorage!)
let accessToken: string | null = null;

export const setAccessToken = (token: string | null): void => {
  accessToken = token;
};

export const getAccessToken = (): string | null => {
  return accessToken;
};

// API-Client
const api = axios.create({
  baseURL: '/api/v1',
  withCredentials: true, // HttpOnly Cookie mitsenden
  headers: {
    'Content-Type': 'application/json',
  },
});

// Request-Interceptor: Access-Token anfuegen
api.interceptors.request.use((config) => {
  if (accessToken) {
    config.headers.Authorization = `Bearer ${accessToken}`;
  }
  return config;
});

// Response-Interceptor: Bei 401 automatisch Token erneuern (Silent Refresh)
api.interceptors.response.use(
  (response) => response,
  async (error) => {
    const originalRequest = error.config;

    // Bei 401 und noch kein Retry versucht
    if (
      error.response?.status === 401 &&
      !originalRequest._retry &&
      originalRequest.url !== '/auth/refresh' &&
      originalRequest.url !== '/auth/login'
    ) {
      originalRequest._retry = true;

      try {
        // Silent Refresh via HttpOnly Cookie
        const { data } = await axios.post<{ accessToken: string }>(
          '/api/v1/auth/refresh',
          {},
          { withCredentials: true },
        );

        setAccessToken(data.accessToken);
        originalRequest.headers.Authorization = `Bearer ${data.accessToken}`;
        return api(originalRequest);
      } catch {
        // Refresh fehlgeschlagen: Logout
        setAccessToken(null);
        window.location.href = '/login';
        return Promise.reject(error);
      }
    }

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

export default api;
