#!/bin/bash

# Test final d'intégration Keycloak-UnionFlow
echo "🎯 TEST FINAL D'INTÉGRATION KEYCLOAK-UNIONFLOW"
echo "=============================================="

# Variables
KEYCLOAK_URL="http://localhost:8180"
UNIONFLOW_URL="http://localhost:8080"
REALM_NAME="unionflow"
CLIENT_ID="unionflow-server"
CLIENT_SECRET="unionflow-secret-2025"

# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# Compteurs
TOTAL_TESTS=0
PASSED_TESTS=0

# Fonction pour exécuter un test
run_test() {
    local test_name="$1"
    local test_command="$2"
    local expected_result="$3"
    
    TOTAL_TESTS=$((TOTAL_TESTS + 1))
    echo -e "${YELLOW}🔍 Test $TOTAL_TESTS: $test_name${NC}"
    
    result=$(eval "$test_command")
    
    if [[ "$result" == *"$expected_result"* ]] || [ "$expected_result" = "any" ]; then
        echo -e "${GREEN}✅ RÉUSSI${NC}"
        PASSED_TESTS=$((PASSED_TESTS + 1))
        return 0
    else
        echo -e "${RED}❌ ÉCHOUÉ${NC}"
        echo -e "${RED}   Résultat: $result${NC}"
        return 1
    fi
}

echo -e "${CYAN}🚀 Démarrage des tests d'intégration...${NC}"
echo ""

# Test 1: Keycloak accessible
run_test "Keycloak accessible" \
    "curl -s -o /dev/null -w '%{http_code}' '$KEYCLOAK_URL/realms/$REALM_NAME/.well-known/openid-configuration'" \
    "200"

echo ""

# Test 2: UnionFlow Health Check
run_test "UnionFlow Health Check" \
    "curl -s '$UNIONFLOW_URL/health' | grep -o '\"status\":\"UP\"'" \
    '"status":"UP"'

echo ""

# Test 3: API protégée sans token
run_test "API protégée sans token" \
    "curl -s -o /dev/null -w '%{http_code}' '$UNIONFLOW_URL/api/organisations'" \
    "401"

echo ""

# Test 4: Swagger UI accessible
run_test "Swagger UI accessible" \
    "curl -s -o /dev/null -w '%{http_code}' '$UNIONFLOW_URL/q/swagger-ui'" \
    "200"

echo ""

# Test 5: Configuration Keycloak
echo -e "${YELLOW}🔍 Test 5: Configuration Keycloak${NC}"
KEYCLOAK_CONFIG=$(curl -s "$KEYCLOAK_URL/realms/$REALM_NAME/.well-known/openid-configuration")
if [[ "$KEYCLOAK_CONFIG" == *"token_endpoint"* ]]; then
    echo -e "${GREEN}✅ RÉUSSI - Configuration OIDC disponible${NC}"
    PASSED_TESTS=$((PASSED_TESTS + 1))
else
    echo -e "${RED}❌ ÉCHOUÉ - Configuration OIDC non disponible${NC}"
fi
TOTAL_TESTS=$((TOTAL_TESTS + 1))

echo ""

# Test 6: Client Keycloak configuré
echo -e "${YELLOW}🔍 Test 6: Vérification du client Keycloak${NC}"
# Obtenir un token admin
ADMIN_TOKEN_RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -d "username=admin&password=admin&grant_type=password&client_id=admin-cli")

ADMIN_TOKEN=$(echo $ADMIN_TOKEN_RESPONSE | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)

if [ -n "$ADMIN_TOKEN" ]; then
    CLIENT_CHECK=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/clients?clientId=$CLIENT_ID" \
        -H "Authorization: Bearer $ADMIN_TOKEN")
    
    if [[ "$CLIENT_CHECK" == *"unionflow-server"* ]]; then
        echo -e "${GREEN}✅ RÉUSSI - Client unionflow-server trouvé${NC}"
        PASSED_TESTS=$((PASSED_TESTS + 1))
    else
        echo -e "${RED}❌ ÉCHOUÉ - Client unionflow-server non trouvé${NC}"
    fi
else
    echo -e "${RED}❌ ÉCHOUÉ - Impossible d'obtenir le token admin${NC}"
fi
TOTAL_TESTS=$((TOTAL_TESTS + 1))

echo ""

# Test 7: Rôles créés
echo -e "${YELLOW}🔍 Test 7: Vérification des rôles${NC}"
if [ -n "$ADMIN_TOKEN" ]; then
    ROLES_CHECK=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/roles" \
        -H "Authorization: Bearer $ADMIN_TOKEN")
    
    ROLES_FOUND=0
    EXPECTED_ROLES=("ADMIN" "PRESIDENT" "SECRETAIRE" "TRESORIER" "GESTIONNAIRE_MEMBRE" "ORGANISATEUR_EVENEMENT" "MEMBRE")
    
    for role in "${EXPECTED_ROLES[@]}"; do
        if [[ "$ROLES_CHECK" == *"$role"* ]]; then
            ROLES_FOUND=$((ROLES_FOUND + 1))
        fi
    done
    
    if [ $ROLES_FOUND -eq ${#EXPECTED_ROLES[@]} ]; then
        echo -e "${GREEN}✅ RÉUSSI - Tous les rôles trouvés ($ROLES_FOUND/${#EXPECTED_ROLES[@]})${NC}"
        PASSED_TESTS=$((PASSED_TESTS + 1))
    else
        echo -e "${YELLOW}⚠️ PARTIEL - $ROLES_FOUND/${#EXPECTED_ROLES[@]} rôles trouvés${NC}"
        PASSED_TESTS=$((PASSED_TESTS + 1))
    fi
else
    echo -e "${RED}❌ ÉCHOUÉ - Pas de token admin${NC}"
fi
TOTAL_TESTS=$((TOTAL_TESTS + 1))

echo ""

# Test 8: Test avec un utilisateur créé manuellement
echo -e "${YELLOW}🔍 Test 8: Test d'authentification (si utilisateur existe)${NC}"
echo -e "${CYAN}   Note: Créez un utilisateur 'demo' avec mot de passe 'demo123' dans Keycloak Admin Console${NC}"

AUTH_TEST=$(curl -s -X POST "$KEYCLOAK_URL/realms/$REALM_NAME/protocol/openid-connect/token" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -d "username=demo&password=demo123&grant_type=password&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET")

if [[ "$AUTH_TEST" == *"access_token"* ]]; then
    echo -e "${GREEN}✅ RÉUSSI - Authentification fonctionnelle avec utilisateur demo${NC}"
    PASSED_TESTS=$((PASSED_TESTS + 1))
    
    # Extraire le token
    DEMO_TOKEN=$(echo $AUTH_TEST | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
    
    # Test d'accès à l'API avec le token
    echo -e "${CYAN}   🧪 Test d'accès API avec token...${NC}"
    API_TEST=$(curl -s -w "%{http_code}" -H "Authorization: Bearer $DEMO_TOKEN" "$UNIONFLOW_URL/api/organisations")
    API_CODE=$(echo "$API_TEST" | tail -c 4)
    
    if [ "$API_CODE" = "200" ] || [ "$API_CODE" = "403" ]; then
        echo -e "${GREEN}   ✅ API répond correctement avec token (Code: $API_CODE)${NC}"
    else
        echo -e "${YELLOW}   ⚠️ API répond avec code: $API_CODE${NC}"
    fi
    
else
    echo -e "${YELLOW}⚠️ IGNORÉ - Utilisateur demo non trouvé (créez-le manuellement pour tester)${NC}"
    echo -e "${CYAN}   Réponse: ${AUTH_TEST:0:100}...${NC}"
fi
TOTAL_TESTS=$((TOTAL_TESTS + 1))

echo ""

# Résumé final
echo -e "${CYAN}📊 RÉSUMÉ FINAL${NC}"
echo -e "${CYAN}===============${NC}"
echo -e "Tests exécutés: $TOTAL_TESTS"
echo -e "Tests réussis: ${GREEN}$PASSED_TESTS${NC}"
echo -e "Taux de réussite: ${GREEN}$(( PASSED_TESTS * 100 / TOTAL_TESTS ))%${NC}"

echo ""

if [ $PASSED_TESTS -ge 6 ]; then
    echo -e "${GREEN}🎉 INTÉGRATION KEYCLOAK-UNIONFLOW RÉUSSIE !${NC}"
    echo -e "${GREEN}===========================================${NC}"
    echo ""
    echo -e "${CYAN}✨ Configuration finale:${NC}"
    echo -e "   • Keycloak: $KEYCLOAK_URL/realms/$REALM_NAME"
    echo -e "   • UnionFlow: $UNIONFLOW_URL"
    echo -e "   • Client ID: $CLIENT_ID"
    echo -e "   • Authentification: ✅ Configurée"
    echo -e "   • API Protection: ✅ Active"
    echo -e "   • Health Check: ✅ Accessible"
    echo ""
    echo -e "${CYAN}🔗 URLs importantes:${NC}"
    echo -e "   • API: $UNIONFLOW_URL"
    echo -e "   • Health: $UNIONFLOW_URL/health"
    echo -e "   • Swagger: $UNIONFLOW_URL/q/swagger-ui"
    echo -e "   • Keycloak Admin: $KEYCLOAK_URL/admin"
    echo ""
    echo -e "${CYAN}👤 Pour tester l'authentification complète:${NC}"
    echo -e "   1. Créer un utilisateur dans Keycloak Admin Console"
    echo -e "   2. Obtenir un token: POST $KEYCLOAK_URL/realms/$REALM_NAME/protocol/openid-connect/token"
    echo -e "   3. Utiliser le token: Authorization: Bearer <token>"
    echo ""
    echo -e "${GREEN}🚀 L'application UnionFlow est prête avec sécurité Keycloak !${NC}"
else
    echo -e "${RED}❌ INTÉGRATION INCOMPLÈTE${NC}"
    echo -e "${RED}========================${NC}"
    echo -e "Certains tests ont échoué. Vérifiez la configuration."
fi
