#!/bin/bash

# Script de test de la configuration Keycloak pour lions-user-manager
# Usage: ./test-keycloak-config.sh

set -e

KEYCLOAK_URL="http://localhost:8180"
REALM="lions-user-manager"
CLIENT_ID="lions-user-manager-client"
CLIENT_SECRET="NTuaQpk5E6qiMqAWTFrCOcIkOABzZzKO"
USERNAME="testadmin"
PASSWORD="admin123"
BACKEND_URL="http://localhost:8081"

echo "=========================================="
echo "Test de configuration Keycloak"
echo "=========================================="
echo ""

# Test 1: Vérifier que Keycloak est accessible
echo "[1/4] Vérification de l'accès à Keycloak..."
if curl -s -f "$KEYCLOAK_URL" > /dev/null 2>&1; then
    echo "✅ Keycloak est accessible sur $KEYCLOAK_URL"
else
    echo "❌ Keycloak n'est pas accessible sur $KEYCLOAK_URL"
    echo "   Assurez-vous que Keycloak est démarré."
    exit 1
fi
echo ""

# Test 2: Obtenir un token
echo "[2/4] Obtention d'un token d'accès..."
TOKEN_RESPONSE=$(curl -s -X POST \
  "$KEYCLOAK_URL/realms/$REALM/protocol/openid-connect/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=$CLIENT_ID" \
  -d "client_secret=$CLIENT_SECRET" \
  -d "grant_type=password" \
  -d "username=$USERNAME" \
  -d "password=$PASSWORD" \
  -d "scope=openid profile email roles")

if echo "$TOKEN_RESPONSE" | grep -q "access_token"; then
    ACCESS_TOKEN=$(echo "$TOKEN_RESPONSE" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
    echo "✅ Token obtenu avec succès"
    echo "   Token (premiers 50 caractères): ${ACCESS_TOKEN:0:50}..."
else
    echo "❌ Impossible d'obtenir un token"
    echo "   Réponse de Keycloak:"
    echo "$TOKEN_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$TOKEN_RESPONSE"
    echo ""
    echo "Vérifiez que:"
    echo "  - Le realm '$REALM' existe"
    echo "  - Le client '$CLIENT_ID' existe avec le bon secret"
    echo "  - L'utilisateur '$USERNAME' existe avec le mot de passe '$PASSWORD'"
    exit 1
fi
echo ""

# Test 3: Vérifier le contenu du token
echo "[3/4] Vérification du contenu du token..."
TOKEN_PAYLOAD=$(echo "$ACCESS_TOKEN" | cut -d'.' -f2)
# Ajouter le padding si nécessaire pour base64
TOKEN_PAYLOAD_PADDED=$(echo "$TOKEN_PAYLOAD" | awk '{while(length($0) % 4 != 0) $0 = $0 "="; print}')
TOKEN_DECODED=$(echo "$TOKEN_PAYLOAD_PADDED" | base64 -d 2>/dev/null || echo "{}")

echo "$TOKEN_DECODED" | python3 -m json.tool > /tmp/token_decoded.json 2>/dev/null || echo "$TOKEN_DECODED" > /tmp/token_decoded.json

if grep -q "realm_access" /tmp/token_decoded.json; then
    echo "✅ Le token contient les rôles (realm_access)"
    ROLES=$(cat /tmp/token_decoded.json | grep -A 10 "realm_access" | grep -A 5 "roles" || echo "[]")
    echo "   Rôles trouvés: $ROLES"
else
    echo "❌ Le token ne contient pas realm_access.roles"
    echo "   Vérifiez la configuration du client scope 'roles' dans Keycloak"
fi

if grep -q "\"admin\"" /tmp/token_decoded.json || grep -q "\"user_manager\"" /tmp/token_decoded.json; then
    echo "✅ L'utilisateur a le rôle 'admin' ou 'user_manager'"
else
    echo "⚠️  L'utilisateur n'a pas le rôle 'admin' ou 'user_manager'"
    echo "   L'endpoint /api/users/search nécessite un de ces rôles"
    echo "   Assignez le rôle 'admin' ou 'user_manager' à l'utilisateur '$USERNAME'"
fi
echo ""

# Test 4: Tester l'API backend
echo "[4/4] Test de l'endpoint /api/users/search..."
API_RESPONSE=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X POST \
  "$BACKEND_URL/api/users/search" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "realmName": "'"$REALM"'",
    "page": 0,
    "pageSize": 20
  }' 2>/dev/null)

HTTP_CODE=$(echo "$API_RESPONSE" | grep "HTTP_CODE:" | cut -d':' -f2)
RESPONSE_BODY=$(echo "$API_RESPONSE" | sed '/HTTP_CODE:/d')

if [ "$HTTP_CODE" = "200" ]; then
    echo "✅ Endpoint /api/users/search accessible (HTTP 200)"
    echo "   Nombre d'utilisateurs trouvés: $(echo "$RESPONSE_BODY" | grep -o '"totalCount":[0-9]*' | cut -d':' -f2 || echo "?")"
elif [ "$HTTP_CODE" = "000" ] || [ -z "$HTTP_CODE" ]; then
    echo "❌ Le backend n'est pas accessible sur $BACKEND_URL"
    echo "   Assurez-vous que lions-user-manager-server est démarré (mvn quarkus:dev)"
elif [ "$HTTP_CODE" = "401" ]; then
    echo "❌ Erreur 401 Unauthorized"
    echo "   Le token n'est pas accepté par le backend"
    echo "   Vérifiez que le serveur utilise le même realm dans application.properties"
elif [ "$HTTP_CODE" = "403" ]; then
    echo "❌ Erreur 403 Forbidden"
    echo "   L'utilisateur n'a pas les permissions nécessaires"
    echo "   Assignez le rôle 'admin' ou 'user_manager' à l'utilisateur"
elif [ "$HTTP_CODE" = "405" ]; then
    echo "❌ Erreur 405 Method Not Allowed"
    echo "   C'est l'erreur que vous rencontriez !"
    echo "   Vérifiez que le serveur backend est bien configuré avec le realm '$REALM'"
else
    echo "⚠️  Réponse HTTP $HTTP_CODE"
    echo "   Réponse: $RESPONSE_BODY"
fi
echo ""

# Résumé
echo "=========================================="
echo "Résumé du test"
echo "=========================================="
echo ""
if [ "$HTTP_CODE" = "200" ]; then
    echo "🎉 Configuration correcte ! Tout fonctionne."
    echo ""
    echo "Vous pouvez maintenant:"
    echo "  1. Démarrer le client: cd lions-user-manager-client-quarkus-primefaces-freya && mvn quarkus:dev"
    echo "  2. Accéder à: http://localhost:8082"
    echo "  3. Se connecter avec: $USERNAME / $PASSWORD"
    echo "  4. Naviguer vers: /pages/user-manager/users/list.xhtml"
else
    echo "❌ La configuration nécessite des ajustements."
    echo ""
    echo "Consultez le fichier KEYCLOAK_DEV_SETUP.md pour les instructions complètes."
fi
echo ""

# Cleanup
rm -f /tmp/token_decoded.json
