#!/bin/bash
# Configuration Keycloak pour UnionFlow
# Crée les rôles et les comptes de test pour MUKEFI et MESKA

set -e

# Configuration
KEYCLOAK_URL="http://localhost:8180"
REALM_NAME="unionflow"
ADMIN_USERNAME="admin"
ADMIN_PASSWORD="admin"
TEST_PASSWORD="Test@123"

echo "========================================================================"
echo "Configuration Keycloak pour UnionFlow"
echo "========================================================================"

# 1. Obtenir le token admin
echo ""
echo "📡 Connexion à Keycloak..."
TOKEN_RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" \
  -d "client_id=admin-cli" \
  -d "username=$ADMIN_USERNAME" \
  -d "password=$ADMIN_PASSWORD" \
  -d "grant_type=password")

ACCESS_TOKEN=$(echo $TOKEN_RESPONSE | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)

if [ -z "$ACCESS_TOKEN" ]; then
    echo "❌ Erreur: Impossible d'obtenir le token admin"
    exit 1
fi

echo "✅ Connecté à Keycloak Admin API"

# 2. Lister et supprimer les utilisateurs existants
echo ""
echo "📋 Audit et nettoyage des utilisateurs existants..."
USERS=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users" \
  -H "Authorization: Bearer $ACCESS_TOKEN")

echo "$USERS" | grep -o '"username":"[^"]*' | cut -d'"' -f4 | while read username; do
    USER_ID=$(echo "$USERS" | grep -B5 "\"username\":\"$username\"" | grep -o '"id":"[^"]*' | cut -d'"' -f4 | head -1)
    if [ ! -z "$USER_ID" ]; then
        curl -s -X DELETE "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users/$USER_ID" \
          -H "Authorization: Bearer $ACCESS_TOKEN"
        echo "  ✅ Supprimé: $username"
    fi
done

# 3. Créer les rôles
echo ""
echo "👥 Création de la structure de rôles..."

declare -a ROLES=(
    "SUPER_ADMIN|Super administrateur - Accès total plateforme"
    "ADMIN_ORGANISATION|Administrateur organisation - Accès total"
    "TRESORIER|Trésorier - Gestion financière et comptabilité"
    "SECRETAIRE|Secrétaire - Gestion administrative et membres"
    "RESPONSABLE_SOCIAL|Responsable social - Aide sociale"
    "RESPONSABLE_EVENEMENTS|Responsable événements - Événements"
    "RESPONSABLE_CREDIT|Responsable crédit - Épargne et crédit"
    "MEMBRE_BUREAU|Membre du bureau - Accès étendu"
    "MEMBRE_ACTIF|Membre actif - Accès de base"
    "MEMBRE_SIMPLE|Membre simple - Consultation uniquement"
    "MEMBRE|Rôle technique - Membre base"
    "ADMIN|Rôle technique - Admin base"
    "USER|Rôle technique - Utilisateur base"
)

for role_data in "${ROLES[@]}"; do
    ROLE_NAME=$(echo $role_data | cut -d'|' -f1)
    ROLE_DESC=$(echo $role_data | cut -d'|' -f2)

    curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/roles" \
      -H "Authorization: Bearer $ACCESS_TOKEN" \
      -H "Content-Type: application/json" \
      -d "{\"name\":\"$ROLE_NAME\",\"description\":\"$ROLE_DESC\"}" > /dev/null 2>&1

    if [ $? -eq 0 ]; then
        echo "  ✅ Rôle créé: $ROLE_NAME"
    else
        echo "  ⚠️  Rôle existe ou erreur: $ROLE_NAME"
    fi
done

# Fonction pour créer un utilisateur
create_user() {
    local USERNAME=$1
    local EMAIL=$2
    local FIRSTNAME=$3
    local LASTNAME=$4
    shift 4
    local ROLES=("$@")

    # Créer l'utilisateur
    curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users" \
      -H "Authorization: Bearer $ACCESS_TOKEN" \
      -H "Content-Type: application/json" \
      -d "{
        \"username\":\"$USERNAME\",
        \"email\":\"$EMAIL\",
        \"firstName\":\"$FIRSTNAME\",
        \"lastName\":\"$LASTNAME\",
        \"enabled\":true,
        \"emailVerified\":true,
        \"credentials\":[{\"type\":\"password\",\"value\":\"$TEST_PASSWORD\",\"temporary\":false}]
      }"

    # Récupérer l'ID de l'utilisateur
    sleep 1
    USER_ID=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users?username=$USERNAME" \
      -H "Authorization: Bearer $ACCESS_TOKEN" | grep -o '"id":"[^"]*' | cut -d'"' -f4 | head -1)

    if [ ! -z "$USER_ID" ]; then
        # Assigner les rôles
        for ROLE in "${ROLES[@]}"; do
            # Récupérer les détails du rôle
            ROLE_DATA=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/roles/$ROLE" \
              -H "Authorization: Bearer $ACCESS_TOKEN")

            curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users/$USER_ID/role-mappings/realm" \
              -H "Authorization: Bearer $ACCESS_TOKEN" \
              -H "Content-Type: application/json" \
              -d "[$ROLE_DATA]" > /dev/null 2>&1
        done

        echo "  ✅ Utilisateur créé: $USERNAME ($EMAIL) - Rôles: ${ROLES[*]}"
    else
        echo "  ❌ Erreur création: $USERNAME"
    fi
}

# 4. Créer les utilisateurs
echo ""
echo "👤 Création des comptes de test..."
echo "   Mot de passe pour tous: $TEST_PASSWORD"
echo ""

# Super-Admin
create_user "superadmin" "superadmin@unionflow.test" "Super" "Admin" "SUPER_ADMIN" "ADMIN" "USER"

# MUKEFI (Mutuelle)
create_user "admin.mukefi" "admin.mukefi@unionflow.test" "Administrateur" "MUKEFI" "ADMIN_ORGANISATION" "ADMIN" "USER"
create_user "tresorier.mukefi" "tresorier.mukefi@unionflow.test" "Trésorier" "MUKEFI" "TRESORIER" "MEMBRE" "USER"
create_user "secretaire.mukefi" "secretaire.mukefi@unionflow.test" "Secrétaire" "MUKEFI" "SECRETAIRE" "MEMBRE" "USER"
create_user "credit.mukefi" "credit.mukefi@unionflow.test" "Responsable Crédit" "MUKEFI" "RESPONSABLE_CREDIT" "MEMBRE" "USER"
create_user "membre.mukefi" "membre.mukefi@unionflow.test" "Membre" "MUKEFI" "MEMBRE_ACTIF" "MEMBRE" "USER"

# MESKA (Association)
create_user "admin.meska" "admin.meska@unionflow.test" "Administrateur" "MESKA" "ADMIN_ORGANISATION" "ADMIN" "USER"
create_user "secretaire.meska" "secretaire.meska@unionflow.test" "Secrétaire" "MESKA" "SECRETAIRE" "MEMBRE" "USER"
create_user "social.meska" "social.meska@unionflow.test" "Responsable Social" "MESKA" "RESPONSABLE_SOCIAL" "MEMBRE" "USER"
create_user "evenements.meska" "evenements.meska@unionflow.test" "Responsable Événements" "MESKA" "RESPONSABLE_EVENEMENTS" "MEMBRE" "USER"
create_user "membre.meska" "membre.meska@unionflow.test" "Membre" "MESKA" "MEMBRE_ACTIF" "MEMBRE" "USER"

echo ""
echo "========================================================================"
echo "✅ Configuration Keycloak terminée avec succès !"
echo "========================================================================"
echo ""
echo "📊 Résumé:"
echo "  • 10 rôles créés"
echo "  • 11 utilisateurs créés"
echo "  • Mot de passe: $TEST_PASSWORD"
echo ""
echo "👥 Comptes créés:"
echo ""
echo "  🔧 Super-Admin:"
echo "    → superadmin@unionflow.test"
echo ""
echo "  🏦 MUKEFI (Mutuelle):"
echo "    → admin.mukefi@unionflow.test (Admin)"
echo "    → tresorier.mukefi@unionflow.test (Trésorier)"
echo "    → secretaire.mukefi@unionflow.test (Secrétaire)"
echo "    → credit.mukefi@unionflow.test (Responsable Crédit)"
echo "    → membre.mukefi@unionflow.test (Membre Actif)"
echo ""
echo "  🤝 MESKA (Association):"
echo "    → admin.meska@unionflow.test (Admin)"
echo "    → secretaire.meska@unionflow.test (Secrétaire)"
echo "    → social.meska@unionflow.test (Responsable Social)"
echo "    → evenements.meska@unionflow.test (Responsable Événements)"
echo "    → membre.meska@unionflow.test (Membre Actif)"
echo ""
echo "🌐 Accès Keycloak:"
echo "  • Console Admin: $KEYCLOAK_URL/admin"
echo "  • Realm: $REALM_NAME"
echo ""
