#!/bin/bash

# =============================================================================
# SCRIPT DE VÉRIFICATION CONFIGURATION UNIONFLOW KEYCLOAK
# =============================================================================
# 
# Ce script vérifie que la configuration des rôles UnionFlow est correcte :
# - Vérification de l'existence des rôles
# - Test d'authentification pour chaque compte
# - Vérification des attributs et permissions
# - Génération d'un rapport de statut
#
# Usage : ./verify-unionflow-keycloak.sh
# =============================================================================

set -e

# Configuration
KEYCLOAK_URL="http://192.168.1.145:8180"
REALM="unionflow"
ADMIN_USER="admin"
ADMIN_PASSWORD="admin"
CLIENT_ID="unionflow-mobile"

# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# Obtenir le token d'administration
get_admin_token() {
    log_info "Obtention du token d'administration..."
    
    local response=$(curl -s -X POST \
        "${KEYCLOAK_URL}/realms/master/protocol/openid-connect/token" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "username=${ADMIN_USER}" \
        -d "password=${ADMIN_PASSWORD}" \
        -d "grant_type=password" \
        -d "client_id=admin-cli")
    
    ADMIN_TOKEN=$(echo "$response" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
    
    if [ -n "$ADMIN_TOKEN" ]; then
        log_success "Token d'administration obtenu"
    else
        log_error "Impossible d'obtenir le token d'administration"
        exit 1
    fi
}

# Vérifier l'existence d'un rôle
check_role() {
    local role_name="$1"
    local expected_level="$2"
    
    local response=$(curl -s -X GET \
        "${KEYCLOAK_URL}/admin/realms/${REALM}/roles/${role_name}" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json")
    
    if echo "$response" | grep -q '"name"'; then
        local level=$(echo "$response" | grep -o '"level":\["[^"]*' | cut -d'"' -f4)
        if [ "$level" = "$expected_level" ]; then
            log_success "✓ Rôle $role_name (niveau $level)"
            return 0
        else
            log_warning "⚠ Rôle $role_name existe mais niveau incorrect: $level (attendu: $expected_level)"
            return 1
        fi
    else
        log_error "✗ Rôle $role_name manquant"
        return 1
    fi
}

# Tester l'authentification d'un utilisateur
test_user_auth() {
    local username="$1"
    local password="$2"
    local expected_role="$3"
    
    log_info "Test authentification: $username"
    
    local auth_response=$(curl -s -X POST \
        "${KEYCLOAK_URL}/realms/${REALM}/protocol/openid-connect/token" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "username=${username}" \
        -d "password=${password}" \
        -d "grant_type=password" \
        -d "client_id=${CLIENT_ID}")
    
    if echo "$auth_response" | grep -q "access_token"; then
        # Décoder le token pour vérifier les rôles
        local access_token=$(echo "$auth_response" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
        
        # Obtenir les informations utilisateur
        local user_info=$(curl -s -X GET \
            "${KEYCLOAK_URL}/realms/${REALM}/protocol/openid-connect/userinfo" \
            -H "Authorization: Bearer ${access_token}")
        
        if echo "$user_info" | grep -q "email"; then
            local email=$(echo "$user_info" | grep -o '"email":"[^"]*' | cut -d'"' -f4)
            log_success "✓ $username ($email) - Authentification réussie"
            
            # Vérifier les rôles via l'API admin
            local user_id=$(curl -s -X GET \
                "${KEYCLOAK_URL}/admin/realms/${REALM}/users?username=${username}" \
                -H "Authorization: Bearer ${ADMIN_TOKEN}" \
                -H "Content-Type: application/json" | \
                grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4)
            
            if [ -n "$user_id" ]; then
                local user_roles=$(curl -s -X GET \
                    "${KEYCLOAK_URL}/admin/realms/${REALM}/users/${user_id}/role-mappings/realm" \
                    -H "Authorization: Bearer ${ADMIN_TOKEN}" \
                    -H "Content-Type: application/json")
                
                if echo "$user_roles" | grep -q "\"name\":\"$expected_role\""; then
                    log_success "  → Rôle $expected_role correctement assigné"
                    return 0
                else
                    log_warning "  → Rôle $expected_role non trouvé dans les assignations"
                    return 1
                fi
            fi
        else
            log_error "✗ $username - Impossible d'obtenir les informations utilisateur"
            return 1
        fi
    else
        log_error "✗ $username - Échec de l'authentification"
        echo "Réponse: $auth_response"
        return 1
    fi
}

# Générer un rapport de statut
generate_status_report() {
    echo ""
    echo "============================================================================="
    echo "📊 RAPPORT DE STATUT CONFIGURATION UNIONFLOW"
    echo "============================================================================="
    echo ""
    
    local total_roles=8
    local total_users=8
    local roles_ok=0
    local users_ok=0
    
    # Vérification des rôles
    echo "🔐 VÉRIFICATION DES RÔLES :"
    echo ""
    
    declare -A roles_levels=(
        ["SUPER_ADMINISTRATEUR"]="100"
        ["ADMINISTRATEUR_ORGANISATION"]="85"
        ["RESPONSABLE_TECHNIQUE"]="80"
        ["RESPONSABLE_FINANCIER"]="75"
        ["RESPONSABLE_MEMBRES"]="70"
        ["MEMBRE_ACTIF"]="50"
        ["MEMBRE_SIMPLE"]="30"
        ["VISITEUR"]="0"
    )
    
    for role in "${!roles_levels[@]}"; do
        if check_role "$role" "${roles_levels[$role]}"; then
            ((roles_ok++))
        fi
    done
    
    echo ""
    echo "👥 VÉRIFICATION DES COMPTES DE TEST :"
    echo ""
    
    declare -A test_accounts=(
        ["superadmin"]="SuperAdmin123!:SUPER_ADMINISTRATEUR"
        ["admin.org"]="AdminOrg123!:ADMINISTRATEUR_ORGANISATION"
        ["tech.lead"]="TechLead123!:RESPONSABLE_TECHNIQUE"
        ["tresorier"]="Tresorier123!:RESPONSABLE_FINANCIER"
        ["rh.manager"]="RhManager123!:RESPONSABLE_MEMBRES"
        ["marie.active"]="Marie123!:MEMBRE_ACTIF"
        ["jean.simple"]="Jean123!:MEMBRE_SIMPLE"
        ["visiteur"]="Visiteur123!:VISITEUR"
    )
    
    for username in "${!test_accounts[@]}"; do
        IFS=':' read -r password expected_role <<< "${test_accounts[$username]}"
        if test_user_auth "$username" "$password" "$expected_role"; then
            ((users_ok++))
        fi
    done
    
    echo ""
    echo "============================================================================="
    echo "📈 RÉSUMÉ FINAL"
    echo "============================================================================="
    echo ""
    echo "🔐 Rôles : $roles_ok/$total_roles configurés correctement"
    echo "👥 Utilisateurs : $users_ok/$total_users authentifiés avec succès"
    echo ""
    
    if [ $roles_ok -eq $total_roles ] && [ $users_ok -eq $total_users ]; then
        log_success "🎉 Configuration UnionFlow Keycloak 100% opérationnelle !"
        echo ""
        echo "✅ Tous les rôles sont créés avec les bons niveaux"
        echo "✅ Tous les comptes de test fonctionnent"
        echo "✅ Les assignations de rôles sont correctes"
        echo ""
        echo "🚀 L'application mobile peut maintenant utiliser ces comptes pour les tests !"
        return 0
    else
        log_error "❌ Configuration incomplète détectée"
        echo ""
        echo "🔧 Actions recommandées :"
        if [ $roles_ok -lt $total_roles ]; then
            echo "   • Vérifier la création des rôles manquants"
        fi
        if [ $users_ok -lt $total_users ]; then
            echo "   • Vérifier la création et configuration des utilisateurs"
        fi
        echo "   • Relancer le script setup-unionflow-keycloak.sh si nécessaire"
        return 1
    fi
}

# =============================================================================
# EXÉCUTION DU SCRIPT DE VÉRIFICATION
# =============================================================================

echo "============================================================================="
echo "🔍 VÉRIFICATION CONFIGURATION UNIONFLOW KEYCLOAK"
echo "============================================================================="
echo ""

# Obtenir le token d'administration
get_admin_token

# Générer le rapport de statut complet
generate_status_report

echo ""
echo "============================================================================="
echo "✅ VÉRIFICATION TERMINÉE"
echo "============================================================================="
