package dev.lions.unionflow.server.integration;

import io.quarkus.test.junit.QuarkusTestProfile;
import java.util.HashMap;
import java.util.Map;

/**
 * Profil test d'intégration.
 *
 * <p>Si Docker est disponible (DOCKER_HOST ou npipe accessible), active DevServices PostgreSQL
 * via Testcontainers. Sinon, utilise le PostgreSQL local configuré dans application.properties
 * (localhost:5432/unionflow) — aucun Docker requis pour le développement local.
 *
 * <p>Usage : annoter la classe de test avec :
 * <pre>
 *   {@literal @}QuarkusTest
 *   {@literal @}TestProfile(IntegrationTestProfile.class)
 *   class MonIntegrationTest { ... }
 * </pre>
 */
public class IntegrationTestProfile implements QuarkusTestProfile {

    private static final boolean DOCKER_AVAILABLE = isDockerAvailable();

    @Override
    public String getConfigProfile() {
        return "integration-test";
    }

    @Override
    public Map<String, String> getConfigOverrides() {
        Map<String, String> config = new HashMap<>();
        if (DOCKER_AVAILABLE) {
            config.put("quarkus.devservices.enabled", "true");
            config.put("quarkus.datasource.devservices.reuse", "true");
            config.put("quarkus.datasource.devservices.image-name", "postgres:17-alpine");
        } else {
            // Sans Docker : utiliser le PostgreSQL local (dev env)
            config.put("quarkus.devservices.enabled", "false");
        }
        // Pas de Keycloak DevService : ce test ne valide que la RLS Postgres, pas l'auth.
        // Sans cet override, l'extension quarkus-keycloak-admin-client déclenche un container
        // KC (~40s de boot) via son BuildStep inconditionnel — voir application-test.properties.
        config.put("quarkus.keycloak.devservices.enabled", "false");
        config.put("quarkus.oidc.tenant-enabled", "false");
        config.put("quarkus.mailer.mock", "true");
        return config;
    }

    private static boolean isDockerAvailable() {
        // Opt-in explicite via variable d'environnement (CI ou dev avec Docker actif)
        String flag = System.getenv("USE_DOCKER_TESTS");
        if ("true".equalsIgnoreCase(flag)) {
            return true;
        }
        // Vérification réelle : docker info doit répondre sans erreur
        try {
            ProcessBuilder pb = new ProcessBuilder("docker", "info", "--format", "{{.ServerVersion}}");
            pb.redirectErrorStream(true);
            Process process = pb.start();
            // Vider stdout pour éviter un blocage sur le buffer
            process.getInputStream().transferTo(java.io.OutputStream.nullOutputStream());
            int exitCode = process.waitFor();
            return exitCode == 0;
        } catch (Exception e) {
            return false;
        }
    }
}
