package legion.muyue.best2048.network;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Fournit un client Retrofit configuré pour interagir avec l'API du jeu Best2048.
 * Cette classe utilise un modèle Singleton (paresseux et non strictement thread-safe dans sa forme actuelle)
 * pour l'instance Retrofit, garantissant qu'une seule instance est créée et réutilisée
 * pour toutes les requêtes réseau.
 * La configuration inclut l'URL de base de l'API, un intercepteur pour logger les requêtes/réponses
 * (niveau BODY), et un convertisseur Gson pour la sérialisation/désérialisation JSON.
 */
public class ApiClient {

    /**
     * L'URL de base pour l'API du jeu Best2048.
     * Toutes les requêtes définies dans {@link ApiService} seront relatives à cette URL.
     */
    private static final String BASE_URL = "https://best2048.legion-muyue.fr/api/";

    /**
     * L'instance Singleton de Retrofit.
     * Initialisée paresseusement lors du premier appel à {@link #getClient()}.
     * Note: L'initialisation paresseuse ici n'est pas garantie comme étant thread-safe
     * dans des scénarios de haute concurrence sans synchronisation externe.
     */
    private static Retrofit retrofit = null;

    /**
     * Constructeur privé pour empêcher l'instanciation directe de cette classe utilitaire.
     */
    private ApiClient() {
        // Classe utilitaire, ne doit pas être instanciée.
    }

    /**
     * Récupère l'instance Singleton de Retrofit.
     * Si l'instance n'existe pas encore, elle est créée et configurée avec :
     * <ul>
     * <li>L'URL de base ({@link #BASE_URL}).</li>
     * <li>Un {@link OkHttpClient} personnalisé incluant un {@link HttpLoggingInterceptor}
     * (niveau BODY) pour le débogage réseau.</li>
     * <li>Un {@link GsonConverterFactory} pour gérer la conversion JSON.</li>
     * </ul>
     *
     * @return L'instance Retrofit configurée et prête à l'emploi.
     * @see #getApiService() pour obtenir directement une instance de service API.
     */
    public static Retrofit getClient() {
        if (retrofit == null) {
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);

            // Construit le client OkHttp en ajoutant l'intercepteur
            OkHttpClient client = new OkHttpClient.Builder()
                    .addInterceptor(logging)
                    .build();

            // Construit l'instance Retrofit
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

    /**
     * Crée et retourne une instance de l'interface {@link ApiService}.
     * Utilise l'instance Retrofit obtenue via {@link #getClient()} pour générer
     * l'implémentation du service API.
     *
     * @return Une instance prête à l'emploi de {@link ApiService} pour effectuer des appels API.
     * Retourne une nouvelle instance de service à chaque appel, mais basée sur
     * le même client Retrofit/OkHttp sous-jacent.
     */
    public static ApiService getApiService() {
        return getClient().create(ApiService.class);
    }
}