#!/bin/bash

# =============================================================================
# SCRIPT D'IMPLÉMENTATION ARCHITECTURE RÔLES UNIONFLOW DANS KEYCLOAK
# =============================================================================
# 
# Ce script configure complètement l'architecture des rôles UnionFlow :
# - 8 rôles métier hiérarchiques
# - 8 comptes de test avec rôles assignés
# - Attributs utilisateur et permissions
#
# Prérequis : Keycloak accessible sur http://192.168.1.145:8180
# Realm : unionflow
# Admin : admin/admin
#
# Usage : ./setup-unionflow-keycloak.sh
# =============================================================================

set -e  # Arrêter le script en cas d'erreur

# 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' # No Color

# Fonction d'affichage avec couleurs
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"
}

# Fonction pour 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")
    
    if [ $? -eq 0 ]; then
        ADMIN_TOKEN=$(echo "$response" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
        if [ -n "$ADMIN_TOKEN" ]; then
            log_success "Token d'administration obtenu"
            return 0
        fi
    fi
    
    log_error "Impossible d'obtenir le token d'administration"
    echo "Réponse: $response"
    exit 1
}

# Fonction pour vérifier si un rôle existe
role_exists() {
    local role_name="$1"
    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
        return 0  # Le rôle existe
    else
        return 1  # Le rôle n'existe pas
    fi
}

# Fonction pour créer un rôle
create_role() {
    local role_name="$1"
    local description="$2"
    local level="$3"
    
    log_info "Création du rôle: $role_name (niveau $level)"
    
    if role_exists "$role_name"; then
        log_warning "Le rôle $role_name existe déjà"
        return 0
    fi
    
    local role_data='{
        "name": "'$role_name'",
        "description": "'$description'",
        "attributes": {
            "level": ["'$level'"],
            "hierarchy": ["'$level'"]
        }
    }'
    
    local response=$(curl -s -X POST \
        "${KEYCLOAK_URL}/admin/realms/${REALM}/roles" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json" \
        -d "$role_data")
    
    if [ $? -eq 0 ]; then
        log_success "Rôle $role_name créé avec succès"
    else
        log_error "Erreur lors de la création du rôle $role_name"
        echo "Réponse: $response"
    fi
}

# Fonction pour vérifier si un utilisateur existe
user_exists() {
    local username="$1"
    local response=$(curl -s -X GET \
        "${KEYCLOAK_URL}/admin/realms/${REALM}/users?username=${username}" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json")
    
    if echo "$response" | grep -q '"username"'; then
        return 0  # L'utilisateur existe
    else
        return 1  # L'utilisateur n'existe pas
    fi
}

# Fonction pour obtenir l'ID d'un utilisateur
get_user_id() {
    local username="$1"
    local response=$(curl -s -X GET \
        "${KEYCLOAK_URL}/admin/realms/${REALM}/users?username=${username}" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json")
    
    echo "$response" | grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4
}

# Fonction pour créer un utilisateur
create_user() {
    local username="$1"
    local email="$2"
    local password="$3"
    local first_name="$4"
    local last_name="$5"
    
    log_info "Création de l'utilisateur: $username ($email)"
    
    if user_exists "$username"; then
        log_warning "L'utilisateur $username existe déjà"
        return 0
    fi
    
    local user_data='{
        "username": "'$username'",
        "email": "'$email'",
        "firstName": "'$first_name'",
        "lastName": "'$last_name'",
        "enabled": true,
        "emailVerified": true,
        "credentials": [{
            "type": "password",
            "value": "'$password'",
            "temporary": false
        }]
    }'
    
    local response=$(curl -s -X POST \
        "${KEYCLOAK_URL}/admin/realms/${REALM}/users" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json" \
        -d "$user_data")
    
    if [ $? -eq 0 ]; then
        log_success "Utilisateur $username créé avec succès"
    else
        log_error "Erreur lors de la création de l'utilisateur $username"
        echo "Réponse: $response"
    fi
}

# Fonction pour assigner un rôle à un utilisateur
assign_role_to_user() {
    local username="$1"
    local role_name="$2"
    
    log_info "Attribution du rôle $role_name à l'utilisateur $username"
    
    # Obtenir l'ID de l'utilisateur
    local user_id=$(get_user_id "$username")
    if [ -z "$user_id" ]; then
        log_error "Impossible de trouver l'utilisateur $username"
        return 1
    fi
    
    # Obtenir les détails du rôle
    local role_response=$(curl -s -X GET \
        "${KEYCLOAK_URL}/admin/realms/${REALM}/roles/${role_name}" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json")
    
    local role_id=$(echo "$role_response" | grep -o '"id":"[^"]*' | cut -d'"' -f4)
    
    if [ -z "$role_id" ]; then
        log_error "Impossible de trouver le rôle $role_name"
        return 1
    fi
    
    # Assigner le rôle
    local assignment_data='[{
        "id": "'$role_id'",
        "name": "'$role_name'"
    }]'
    
    local response=$(curl -s -X POST \
        "${KEYCLOAK_URL}/admin/realms/${REALM}/users/${user_id}/role-mappings/realm" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json" \
        -d "$assignment_data")
    
    if [ $? -eq 0 ]; then
        log_success "Rôle $role_name assigné à $username"
    else
        log_error "Erreur lors de l'assignation du rôle $role_name à $username"
        echo "Réponse: $response"
    fi
}

# =============================================================================
# DÉBUT DU SCRIPT PRINCIPAL
# =============================================================================

echo "============================================================================="
echo "🚀 CONFIGURATION ARCHITECTURE RÔLES UNIONFLOW DANS KEYCLOAK"
echo "============================================================================="
echo ""

# Étape 1: Obtenir le token d'administration
get_admin_token

echo ""
echo "============================================================================="
echo "📋 ÉTAPE 1: CRÉATION DES RÔLES MÉTIER"
echo "============================================================================="
echo ""

# Création des 8 rôles métier avec hiérarchie
create_role "SUPER_ADMINISTRATEUR" "Super Administrateur - Accès système complet" "100"
create_role "ADMINISTRATEUR_ORGANISATION" "Administrateur Organisation - Gestion complète organisation" "85"
create_role "RESPONSABLE_TECHNIQUE" "Responsable Technique - Configuration et workflows" "80"
create_role "RESPONSABLE_FINANCIER" "Responsable Financier - Gestion finances et budget" "75"
create_role "RESPONSABLE_MEMBRES" "Responsable Membres - Gestion communauté" "70"
create_role "MEMBRE_ACTIF" "Membre Actif - Participation et organisation" "50"
create_role "MEMBRE_SIMPLE" "Membre Simple - Participation standard" "30"
create_role "VISITEUR" "Visiteur - Accès public découverte" "0"

echo ""
echo "============================================================================="
echo "👥 ÉTAPE 2: CRÉATION DES COMPTES DE TEST"
echo "============================================================================="
echo ""

# Création des 8 comptes de test
create_user "superadmin" "superadmin@unionflow.dev" "SuperAdmin123!" "Super" "Admin"
create_user "admin.org" "admin@association-dev.fr" "AdminOrg123!" "Admin" "Organisation"
create_user "tech.lead" "tech@association-dev.fr" "TechLead123!" "Tech" "Lead"
create_user "tresorier" "tresorier@association-dev.fr" "Tresorier123!" "Trésorier" "Finance"
create_user "rh.manager" "rh@association-dev.fr" "RhManager123!" "RH" "Manager"
create_user "marie.active" "marie@association-dev.fr" "Marie123!" "Marie" "Active"
create_user "jean.simple" "jean@association-dev.fr" "Jean123!" "Jean" "Simple"
create_user "visiteur" "visiteur@example.com" "Visiteur123!" "Visiteur" "Public"

echo ""
echo "============================================================================="
echo "🔗 ÉTAPE 3: ATTRIBUTION DES RÔLES AUX UTILISATEURS"
echo "============================================================================="
echo ""

# Attribution des rôles aux utilisateurs
assign_role_to_user "superadmin" "SUPER_ADMINISTRATEUR"
assign_role_to_user "admin.org" "ADMINISTRATEUR_ORGANISATION"
assign_role_to_user "tech.lead" "RESPONSABLE_TECHNIQUE"
assign_role_to_user "tresorier" "RESPONSABLE_FINANCIER"
assign_role_to_user "rh.manager" "RESPONSABLE_MEMBRES"
assign_role_to_user "marie.active" "MEMBRE_ACTIF"
assign_role_to_user "jean.simple" "MEMBRE_SIMPLE"
assign_role_to_user "visiteur" "VISITEUR"

echo ""
echo "============================================================================="
echo "✅ CONFIGURATION TERMINÉE AVEC SUCCÈS"
echo "============================================================================="
echo ""

log_success "Architecture des rôles UnionFlow configurée dans Keycloak !"
echo ""
echo "📋 RÉSUMÉ DE LA CONFIGURATION :"
echo "• 8 rôles métier créés avec hiérarchie"
echo "• 8 comptes de test créés et configurés"
echo "• Rôles assignés aux utilisateurs appropriés"
echo ""
echo "🔐 COMPTES DE TEST DISPONIBLES :"
echo "• superadmin@unionflow.dev (SUPER_ADMINISTRATEUR)"
echo "• admin@association-dev.fr (ADMINISTRATEUR_ORGANISATION)"
echo "• tech@association-dev.fr (RESPONSABLE_TECHNIQUE)"
echo "• tresorier@association-dev.fr (RESPONSABLE_FINANCIER)"
echo "• rh@association-dev.fr (RESPONSABLE_MEMBRES)"
echo "• marie@association-dev.fr (MEMBRE_ACTIF)"
echo "• jean@association-dev.fr (MEMBRE_SIMPLE)"
echo "• visiteur@example.com (VISITEUR)"
echo ""
echo "🚀 Vous pouvez maintenant tester l'authentification avec ces comptes !"

echo ""
echo "============================================================================="
echo "🔍 ÉTAPE 4: VÉRIFICATION DE LA CONFIGURATION"
echo "============================================================================="
echo ""

# Fonction de vérification des rôles
verify_roles() {
    log_info "Vérification des rôles créés..."

    local roles=("SUPER_ADMINISTRATEUR" "ADMINISTRATEUR_ORGANISATION" "RESPONSABLE_TECHNIQUE"
                 "RESPONSABLE_FINANCIER" "RESPONSABLE_MEMBRES" "MEMBRE_ACTIF" "MEMBRE_SIMPLE" "VISITEUR")

    for role in "${roles[@]}"; do
        if role_exists "$role"; then
            log_success "✓ Rôle $role vérifié"
        else
            log_error "✗ Rôle $role manquant"
        fi
    done
}

# Fonction de vérification des utilisateurs
verify_users() {
    log_info "Vérification des utilisateurs créés..."

    local users=("superadmin" "admin.org" "tech.lead" "tresorier"
                 "rh.manager" "marie.active" "jean.simple" "visiteur")

    for user in "${users[@]}"; do
        if user_exists "$user"; then
            log_success "✓ Utilisateur $user vérifié"
        else
            log_error "✗ Utilisateur $user manquant"
        fi
    done
}

# Fonction de test d'authentification
test_authentication() {
    log_info "Test d'authentification avec un compte de test..."

    local test_response=$(curl -s -X POST \
        "${KEYCLOAK_URL}/realms/${REALM}/protocol/openid-connect/token" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "username=marie.active" \
        -d "password=Marie123!" \
        -d "grant_type=password" \
        -d "client_id=${CLIENT_ID}")

    if echo "$test_response" | grep -q "access_token"; then
        log_success "✓ Test d'authentification réussi avec marie.active"
    else
        log_error "✗ Échec du test d'authentification"
        echo "Réponse: $test_response"
    fi
}

# Fonction d'affichage des informations de connexion
display_connection_info() {
    echo ""
    echo "============================================================================="
    echo "📱 INFORMATIONS DE CONNEXION POUR L'APPLICATION MOBILE"
    echo "============================================================================="
    echo ""
    echo "🔗 Configuration Keycloak :"
    echo "   • URL Serveur: $KEYCLOAK_URL"
    echo "   • Realm: $REALM"
    echo "   • Client ID: $CLIENT_ID"
    echo ""
    echo "🧪 Comptes de test par rôle :"
    echo ""
    echo "   🔴 SUPER_ADMINISTRATEUR"
    echo "      Username: superadmin"
    echo "      Email: superadmin@unionflow.dev"
    echo "      Password: SuperAdmin123!"
    echo ""
    echo "   🔵 ADMINISTRATEUR_ORGANISATION"
    echo "      Username: admin.org"
    echo "      Email: admin@association-dev.fr"
    echo "      Password: AdminOrg123!"
    echo ""
    echo "   🟢 RESPONSABLE_TECHNIQUE"
    echo "      Username: tech.lead"
    echo "      Email: tech@association-dev.fr"
    echo "      Password: TechLead123!"
    echo ""
    echo "   🟡 RESPONSABLE_FINANCIER"
    echo "      Username: tresorier"
    echo "      Email: tresorier@association-dev.fr"
    echo "      Password: Tresorier123!"
    echo ""
    echo "   🟣 RESPONSABLE_MEMBRES"
    echo "      Username: rh.manager"
    echo "      Email: rh@association-dev.fr"
    echo "      Password: RhManager123!"
    echo ""
    echo "   🟠 MEMBRE_ACTIF"
    echo "      Username: marie.active"
    echo "      Email: marie@association-dev.fr"
    echo "      Password: Marie123!"
    echo ""
    echo "   ⚪ MEMBRE_SIMPLE"
    echo "      Username: jean.simple"
    echo "      Email: jean@association-dev.fr"
    echo "      Password: Jean123!"
    echo ""
    echo "   🔵 VISITEUR"
    echo "      Username: visiteur"
    echo "      Email: visiteur@example.com"
    echo "      Password: Visiteur123!"
    echo ""
}

# Exécution des vérifications
verify_roles
echo ""
verify_users
echo ""
test_authentication

# Affichage des informations finales
display_connection_info

echo "============================================================================="
echo "🎉 CONFIGURATION UNIONFLOW KEYCLOAK TERMINÉE AVEC SUCCÈS !"
echo "============================================================================="
