import axios, { AxiosInstance } from 'axios';
import { TokenStorage } from './tokenStorage';

// T0177: Créer un client axios séparé pour le refresh pour éviter les interceptors
// Lazy initialization pour faciliter les tests
let refreshClient: AxiosInstance | null = null;

function getRefreshClient(): AxiosInstance {
  if (!refreshClient) {
    refreshClient = axios.create({
      baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api/v1',
      timeout: 10000,
      headers: {
        'Content-Type': 'application/json',
      },
    });
  }
  return refreshClient;
}

/**
 * TokenRefresh - Service de rafraîchissement des tokens d'authentification
 * T0176: Service pour rafraîchir les tokens via l'endpoint /auth/refresh
 */

export interface RefreshTokenResponse {
  access_token: string;
  refresh_token: string;
  expires_in: number;
}

/**
 * Rafraîchit le token d'accès en utilisant le refresh token
 * T0176: Appelle l'endpoint POST /api/v1/auth/refresh et met à jour les tokens
 * @returns Promise qui se résout quand le token est rafraîchi
 * @throws Error si le refresh token n'est pas disponible ou si le refresh échoue
 */
export async function refreshToken(): Promise<void> {
  // T0176: Récupérer le refresh token depuis le stockage
  const refreshToken = TokenStorage.getRefreshToken();
  if (!refreshToken) {
    throw new Error('No refresh token available');
  }

  try {
    // T0176: Appeler l'endpoint POST /auth/refresh
    // T0177: Utiliser refreshClient pour éviter les interceptors (qui causeraient une boucle)
    const client = getRefreshClient();
    const response = await client.post<RefreshTokenResponse>('/auth/refresh', {
      refresh_token: refreshToken,
    });

    // T0176: Mettre à jour les tokens stockés
    TokenStorage.setTokens(response.data.access_token, response.data.refresh_token);
  } catch (error) {
    // T0176: Gérer les erreurs - supprimer les tokens en cas d'échec
    TokenStorage.clearTokens();
    throw error;
  }
}

