#!/bin/bash

# Script de vérification de la configuration Keycloak pour UnionFlow
# Vérifie que les rôles sont bien configurés et mappés dans les tokens

set -e

KEYCLOAK_URL="${KEYCLOAK_URL:-http://localhost:8180}"
REALM="unionflow"
ADMIN_USER="${KEYCLOAK_ADMIN:-admin}"
ADMIN_PASSWORD="${KEYCLOAK_ADMIN_PASSWORD:-admin}"
CLIENT_ID_NAME="unionflow-client"

echo "======================================"
echo "  Vérification Keycloak - UnionFlow"
echo "======================================"
echo ""
echo "Keycloak URL: $KEYCLOAK_URL"
echo "Realm: $REALM"
echo ""

# 1. Obtenir token admin
echo "[1/6] Obtention du token admin..."
ADMIN_TOKEN=$(curl -s -X POST "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" \
  -d "client_id=admin-cli" \
  -d "username=$ADMIN_USER" \
  -d "password=$ADMIN_PASSWORD" \
  -d "grant_type=password" 2>/dev/null | jq -r '.access_token')

if [ "$ADMIN_TOKEN" == "null" ] || [ -z "$ADMIN_TOKEN" ]; then
    echo "❌ ERREUR: Impossible d'obtenir le token admin"
    echo "   Vérifiez vos credentials et que Keycloak est accessible sur $KEYCLOAK_URL"
    exit 1
fi

echo "✅ Token admin obtenu"
echo ""

# 2. Lister les realm roles
echo "[2/6] Vérification des realm roles..."
REALM_ROLES=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/roles" \
  -H "Authorization: Bearer $ADMIN_TOKEN" 2>/dev/null | jq -r '.[].name')

EXPECTED_ROLES=(
    "SUPER_ADMIN"
    "ADMIN_ORGANISATION"
    "TRESORIER"
    "SECRETAIRE"
    "RESPONSABLE_SOCIAL"
    "RESPONSABLE_EVENEMENTS"
    "RESPONSABLE_CREDIT"
    "MEMBRE_BUREAU"
    "MEMBRE_ACTIF"
    "MEMBRE_SIMPLE"
)

echo "Rôles personnalisés trouvés:"
MISSING_ROLES=()
for role in "${EXPECTED_ROLES[@]}"; do
    if echo "$REALM_ROLES" | grep -q "^$role$"; then
        echo "  ✅ $role"
    else
        echo "  ❌ $role (MANQUANT)"
        MISSING_ROLES+=("$role")
    fi
done
echo ""

if [ ${#MISSING_ROLES[@]} -gt 0 ]; then
    echo "⚠️  WARNING: ${#MISSING_ROLES[@]} rôle(s) manquant(s)"
    echo "   Exécutez d'abord: unionflow/scripts/keycloak-setup.sh"
    echo ""
fi

# 3. Vérifier le client unionflow-client
echo "[3/6] Vérification du client '$CLIENT_ID_NAME'..."
CLIENT_UUID=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/clients?clientId=$CLIENT_ID_NAME" \
  -H "Authorization: Bearer $ADMIN_TOKEN" 2>/dev/null | jq -r '.[0].id')

if [ "$CLIENT_UUID" == "null" ] || [ -z "$CLIENT_UUID" ]; then
    echo "❌ ERREUR: Client '$CLIENT_ID_NAME' non trouvé dans le realm $REALM"
    exit 1
fi

echo "✅ Client trouvé: $CLIENT_ID_NAME (UUID: $CLIENT_UUID)"
echo ""

# 4. Vérifier les rôles de admin.mukefi@unionflow.test
echo "[4/6] Vérification des rôles de 'admin.mukefi@unionflow.test'..."
USER_ID=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/users?username=admin.mukefi@unionflow.test" \
  -H "Authorization: Bearer $ADMIN_TOKEN" 2>/dev/null | jq -r '.[0].id')

if [ "$USER_ID" == "null" ] || [ -z "$USER_ID" ]; then
    echo "❌ ERREUR: Utilisateur 'admin.mukefi@unionflow.test' non trouvé"
    echo "   Exécutez d'abord: unionflow/scripts/keycloak-setup.sh"
    exit 1
fi

USER_ROLES=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/users/$USER_ID/role-mappings/realm" \
  -H "Authorization: Bearer $ADMIN_TOKEN" 2>/dev/null | jq -r '.[].name')

echo "Rôles assignés à admin.mukefi@unionflow.test:"
if echo "$USER_ROLES" | grep -q "ADMIN_ORGANISATION"; then
    echo "$USER_ROLES" | while read role; do
        echo "  ✅ $role"
    done
else
    echo "  ❌ ADMIN_ORGANISATION (MANQUANT)"
    echo "  $USER_ROLES"
    echo ""
    echo "⚠️  WARNING: Le rôle ADMIN_ORGANISATION n'est pas assigné à cet utilisateur"
fi
echo ""

# 5. Vérifier le client scope 'roles'
echo "[5/6] Vérification du client scope 'roles'..."
ROLES_SCOPE=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/client-scopes" \
  -H "Authorization: Bearer $ADMIN_TOKEN" 2>/dev/null | jq -r '.[] | select(.name=="roles") | .name')

if [ "$ROLES_SCOPE" == "roles" ]; then
    echo "✅ Client scope 'roles' trouvé"
else
    echo "❌ ERREUR: Client scope 'roles' non trouvé"
    echo "   Ce scope est nécessaire pour inclure les rôles dans le token"
fi
echo ""

# 6. Vérifier les mappers du client
echo "[6/6] Vérification des protocol mappers du client..."
MAPPERS=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/clients/$CLIENT_UUID/protocol-mappers/models" \
  -H "Authorization: Bearer $ADMIN_TOKEN" 2>/dev/null)

REALM_ROLE_MAPPER=$(echo "$MAPPERS" | jq -r '.[] | select(.protocolMapper=="oidc-usermodel-realm-role-mapper") | .name')

if [ -n "$REALM_ROLE_MAPPER" ]; then
    echo "✅ Realm role mapper trouvé: '$REALM_ROLE_MAPPER'"

    # Vérifier la configuration du mapper
    MAPPER_CONFIG=$(echo "$MAPPERS" | jq -r '.[] | select(.protocolMapper=="oidc-usermodel-realm-role-mapper")')
    TOKEN_CLAIM=$(echo "$MAPPER_CONFIG" | jq -r '.config["claim.name"]')
    ADD_TO_ID_TOKEN=$(echo "$MAPPER_CONFIG" | jq -r '.config["id.token.claim"]')
    ADD_TO_ACCESS_TOKEN=$(echo "$MAPPER_CONFIG" | jq -r '.config["access.token.claim"]')

    echo "  - Token claim name: $TOKEN_CLAIM"
    echo "  - Add to ID token: $ADD_TO_ID_TOKEN"
    echo "  - Add to access token: $ADD_TO_ACCESS_TOKEN"

    if [ "$ADD_TO_ID_TOKEN" != "true" ]; then
        echo "  ⚠️  WARNING: 'Add to ID token' devrait être 'true'"
    fi
    if [ "$ADD_TO_ACCESS_TOKEN" != "true" ]; then
        echo "  ⚠️  WARNING: 'Add to access token' devrait être 'true'"
    fi
else
    echo "❌ ERREUR: Aucun mapper de type 'oidc-usermodel-realm-role-mapper' trouvé"
    echo "   Les rôles ne seront PAS inclus dans les tokens !"
    echo ""
    echo "   Pour corriger, dans Keycloak Admin:"
    echo "   1. Allez dans Clients > $CLIENT_ID_NAME > Client scopes"
    echo "   2. Cliquez sur le scope dédié (unionflow-client-dedicated)"
    echo "   3. Add mapper > By configuration > User Realm Role"
    echo "   4. Name: realm roles"
    echo "   5. Token Claim Name: roles"
    echo "   6. Add to ID token: ON"
    echo "   7. Add to access token: ON"
fi
echo ""

# Résumé
echo "======================================"
echo "  RÉSUMÉ"
echo "======================================"

if [ ${#MISSING_ROLES[@]} -eq 0 ] && [ -n "$REALM_ROLE_MAPPER" ] && echo "$USER_ROLES" | grep -q "ADMIN_ORGANISATION"; then
    echo "✅ Configuration Keycloak OK"
    echo ""
    echo "Si les rôles n'apparaissent toujours pas dans le token:"
    echo "1. Vérifiez que 'roles' est dans quarkus.oidc.authentication.scopes"
    echo "2. Redémarrez le frontend Quarkus"
    echo "3. Déconnectez-vous et reconnectez-vous dans l'application"
else
    echo "❌ Configuration Keycloak INCOMPLÈTE"
    echo ""
    if [ ${#MISSING_ROLES[@]} -gt 0 ]; then
        echo "- Rôles manquants: ${MISSING_ROLES[@]}"
    fi
    if [ -z "$REALM_ROLE_MAPPER" ]; then
        echo "- Mapper de rôles manquant"
    fi
    if ! echo "$USER_ROLES" | grep -q "ADMIN_ORGANISATION"; then
        echo "- Rôle ADMIN_ORGANISATION non assigné à admin.mukefi@unionflow.test"
    fi
    echo ""
    echo "Exécutez: unionflow/scripts/keycloak-setup.sh"
fi
echo ""
