#!/usr/bin/env python3
"""
Script pour démarrer Keycloak et configurer UnionFlow automatiquement
"""

import subprocess
import time
import requests
import sys
import os

def run_command(command: str, shell: bool = True) -> tuple:
    """Exécute une commande et retourne le code de retour et la sortie"""
    try:
        result = subprocess.run(
            command, 
            shell=shell, 
            capture_output=True, 
            text=True,
            timeout=30
        )
        return result.returncode, result.stdout, result.stderr
    except subprocess.TimeoutExpired:
        return -1, "", "Timeout"
    except Exception as e:
        return -1, "", str(e)

def is_keycloak_running() -> bool:
    """Vérifie si Keycloak est en cours d'exécution"""
    try:
        response = requests.get("http://localhost:8180", timeout=5)
        return response.status_code == 200
    except:
        return False

def stop_existing_keycloak():
    """Arrête les conteneurs Keycloak existants"""
    print("🛑 Arrêt des conteneurs Keycloak existants...")
    
    # Arrêter et supprimer le conteneur s'il existe
    commands = [
        "docker stop unionflow-keycloak",
        "docker rm unionflow-keycloak"
    ]
    
    for cmd in commands:
        run_command(cmd)

def start_keycloak() -> bool:
    """Démarre Keycloak avec Docker"""
    print("🚀 Démarrage de Keycloak...")
    
    # Arrêter les conteneurs existants
    stop_existing_keycloak()
    
    # Démarrer un nouveau conteneur
    docker_cmd = (
        "docker run -d --name unionflow-keycloak "
        "-p 8180:8080 "
        "-e KEYCLOAK_ADMIN=admin "
        "-e KEYCLOAK_ADMIN_PASSWORD=admin123 "
        "-e KC_HOSTNAME_STRICT=false "
        "-e KC_HOSTNAME_STRICT_HTTPS=false "
        "quay.io/keycloak/keycloak:23.0.0 "
        "start-dev --hostname-url=http://localhost:8180"
    )
    
    returncode, stdout, stderr = run_command(docker_cmd)
    
    if returncode != 0:
        print(f"❌ Erreur lors du démarrage de Keycloak: {stderr}")
        return False
    
    print("✅ Conteneur Keycloak démarré")
    
    # Attendre que Keycloak soit prêt
    print("⏳ Attente de la disponibilité de Keycloak...")
    
    max_attempts = 60  # 2 minutes
    for attempt in range(max_attempts):
        if is_keycloak_running():
            print("✅ Keycloak est prêt !")
            return True
        
        if attempt % 10 == 0:
            print(f"   Tentative {attempt + 1}/{max_attempts}...")
        
        time.sleep(2)
    
    print("❌ Keycloak n'est pas devenu disponible dans les temps")
    return False

def main():
    """Fonction principale"""
    print("=" * 80)
    print("🚀 DÉMARRAGE ET CONFIGURATION UNIONFLOW")
    print("=" * 80)
    print()
    
    # 1. Vérifier si Keycloak est déjà en cours d'exécution
    if is_keycloak_running():
        print("✅ Keycloak est déjà en cours d'exécution")
    else:
        # 2. Démarrer Keycloak
        if not start_keycloak():
            print("❌ Impossible de démarrer Keycloak")
            sys.exit(1)
    
    print()
    
    # 3. Lancer la configuration automatique
    print("🔧 Lancement de la configuration automatique...")
    print()
    
    try:
        # Importer et exécuter la configuration
        from setup_keycloak import KeycloakSetup
        
        setup = KeycloakSetup()
        success = setup.setup_complete()
        
        if success:
            print()
            print("🎯 CONFIGURATION TERMINÉE AVEC SUCCÈS !")
            print()
            print("📋 PROCHAINES ÉTAPES :")
            print("   1. Testez les comptes: python test_auth.py")
            print("   2. Lancez votre application mobile UnionFlow")
            print("   3. Utilisez marie.active / Marie123! pour tester")
            print()
        else:
            print("⚠️  Configuration partiellement réussie")
            print("   Consultez les messages ci-dessus pour plus de détails")
            
    except ImportError:
        print("❌ Impossible d'importer setup_keycloak.py")
        print("   Assurez-vous que le fichier existe dans le même répertoire")
        sys.exit(1)
    except Exception as e:
        print(f"❌ Erreur lors de la configuration: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
