#!/bin/bash

echo "============================================================================="
echo "🚀 CONFIGURATION COMPLÈTE KEYCLOAK UNIONFLOW"
echo "============================================================================="

KEYCLOAK_URL="http://localhost:8180"
ADMIN_USER="admin"
ADMIN_PASSWORD="admin123"

# Fonction pour obtenir le token admin
get_admin_token() {
    echo "🔑 Obtention du token administrateur..."
    
    ADMIN_TOKEN=$(curl -s -X POST \
        "${KEYCLOAK_URL}/realms/master/protocol/openid-connect/token" \
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "username=${ADMIN_USER}&password=${ADMIN_PASSWORD}&grant_type=password&client_id=admin-cli" \
        | jq -r '.access_token')
    
    if [ "$ADMIN_TOKEN" = "null" ] || [ -z "$ADMIN_TOKEN" ]; then
        echo "❌ Impossible d'obtenir le token admin"
        exit 1
    fi
    
    echo "✅ Token admin obtenu"
}

# Fonction pour créer le realm
create_realm() {
    echo "🏗️  Création du realm unionflow..."
    
    curl -s -X POST \
        "${KEYCLOAK_URL}/admin/realms" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json" \
        -d '{
            "realm": "unionflow",
            "enabled": true,
            "displayName": "UnionFlow",
            "loginWithEmailAllowed": true,
            "duplicateEmailsAllowed": false,
            "resetPasswordAllowed": true,
            "editUsernameAllowed": false,
            "bruteForceProtected": false
        }'
    
    echo "✅ Realm unionflow créé"
}

# Fonction pour créer le client
create_client() {
    echo "📱 Création du client unionflow-mobile..."
    
    curl -s -X POST \
        "${KEYCLOAK_URL}/admin/realms/unionflow/clients" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json" \
        -d '{
            "clientId": "unionflow-mobile",
            "enabled": true,
            "publicClient": true,
            "directAccessGrantsEnabled": true,
            "standardFlowEnabled": true,
            "implicitFlowEnabled": false,
            "serviceAccountsEnabled": false,
            "redirectUris": ["*"],
            "webOrigins": ["*"]
        }'
    
    echo "✅ Client unionflow-mobile créé"
}

# Fonction pour créer les rôles
create_roles() {
    echo "👥 Création des rôles..."
    
    declare -a ROLES=(
        "SUPER_ADMINISTRATEUR"
        "RESPONSABLE_TECHNIQUE" 
        "RESPONSABLE_MEMBRES"
        "MEMBRE_ACTIF"
        "MEMBRE_SIMPLE"
    )
    
    for role in "${ROLES[@]}"; do
        curl -s -X POST \
            "${KEYCLOAK_URL}/admin/realms/unionflow/roles" \
            -H "Authorization: Bearer ${ADMIN_TOKEN}" \
            -H "Content-Type: application/json" \
            -d "{\"name\": \"${role}\", \"description\": \"Rôle ${role}\"}"
        
        echo "  ✓ Rôle ${role} créé"
    done
}

# Fonction pour créer un utilisateur
create_user() {
    local username=$1
    local email=$2
    local firstname=$3
    local lastname=$4
    local password=$5
    local role=$6
    
    echo "👤 Création de l'utilisateur ${username}..."
    
    # Créer l'utilisateur
    USER_ID=$(curl -s -X POST \
        "${KEYCLOAK_URL}/admin/realms/unionflow/users" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json" \
        -d "{
            \"username\": \"${username}\",
            \"email\": \"${email}\",
            \"firstName\": \"${firstname}\",
            \"lastName\": \"${lastname}\",
            \"enabled\": true,
            \"emailVerified\": true
        }" \
        -w "%{http_code}" -o /dev/null)
    
    if [ "$USER_ID" != "201" ]; then
        echo "  ⚠️  Utilisateur ${username} existe déjà ou erreur de création"
    fi
    
    # Obtenir l'ID de l'utilisateur
    USER_UUID=$(curl -s -X GET \
        "${KEYCLOAK_URL}/admin/realms/unionflow/users?username=${username}" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        | jq -r '.[0].id')
    
    # Définir le mot de passe
    curl -s -X PUT \
        "${KEYCLOAK_URL}/admin/realms/unionflow/users/${USER_UUID}/reset-password" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json" \
        -d "{
            \"type\": \"password\",
            \"value\": \"${password}\",
            \"temporary\": false
        }"
    
    # Assigner le rôle
    ROLE_DATA=$(curl -s -X GET \
        "${KEYCLOAK_URL}/admin/realms/unionflow/roles/${role}" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}")
    
    curl -s -X POST \
        "${KEYCLOAK_URL}/admin/realms/unionflow/users/${USER_UUID}/role-mappings/realm" \
        -H "Authorization: Bearer ${ADMIN_TOKEN}" \
        -H "Content-Type: application/json" \
        -d "[${ROLE_DATA}]"
    
    echo "  ✅ Utilisateur ${username} créé avec le rôle ${role}"
}

# Fonction principale
main() {
    echo "🔍 Vérification de la connexion à Keycloak..."
    
    if ! curl -s "${KEYCLOAK_URL}" > /dev/null; then
        echo "❌ Keycloak n'est pas accessible sur ${KEYCLOAK_URL}"
        exit 1
    fi
    
    echo "✅ Keycloak accessible"
    
    # Obtenir le token admin
    get_admin_token
    
    # Créer le realm
    create_realm
    
    # Créer le client
    create_client
    
    # Créer les rôles
    create_roles
    
    # Créer les utilisateurs
    create_user "superadmin" "superadmin@unionflow.com" "Super" "Admin" "SuperAdmin123!" "SUPER_ADMINISTRATEUR"
    create_user "marie.active" "marie.active@unionflow.com" "Marie" "Active" "Marie123!" "MEMBRE_ACTIF"
    create_user "jean.simple" "jean.simple@unionflow.com" "Jean" "Simple" "Jean123!" "MEMBRE_SIMPLE"
    create_user "tech.lead" "tech.lead@unionflow.com" "Tech" "Lead" "TechLead123!" "RESPONSABLE_TECHNIQUE"
    create_user "rh.manager" "rh.manager@unionflow.com" "RH" "Manager" "RhManager123!" "RESPONSABLE_MEMBRES"
    
    echo ""
    echo "============================================================================="
    echo "✅ CONFIGURATION TERMINÉE !"
    echo "============================================================================="
    echo ""
    echo "🎯 COMPTES CRÉÉS :"
    echo "   • superadmin / SuperAdmin123! (SUPER_ADMINISTRATEUR)"
    echo "   • marie.active / Marie123! (MEMBRE_ACTIF)"
    echo "   • jean.simple / Jean123! (MEMBRE_SIMPLE)"
    echo "   • tech.lead / TechLead123! (RESPONSABLE_TECHNIQUE)"
    echo "   • rh.manager / RhManager123! (RESPONSABLE_MEMBRES)"
    echo ""
    echo "🚀 Testez maintenant avec: ./verify-final.sh"
}

# Vérifier si jq est installé
if ! command -v jq &> /dev/null; then
    echo "❌ jq n'est pas installé. Installation..."
    sudo apt-get update && sudo apt-get install -y jq
fi

main
