<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">

    <!--
        Composant réutilisable: Attribution de Rôles - Écosystème LionsDev
        
        Auteur: Lions User Manager
        Version: 2.0.0
        Description: Interface complète pour attribuer/révoquer des rôles à un utilisateur.
                     Affiche les rôles actuels avec possibilité de révocation, les rôles
                     disponibles classés par type (Realm/Client), et une recherche intégrée.
        
        Paramètres:
        - user: UserDTO (requis) - L'utilisateur concerné
        - availableRoles: List<RoleDTO> (requis) - Liste des rôles disponibles
        - userRoles: List<RoleDTO> (requis) - Liste des rôles actuels de l'utilisateur
        - update: String (défaut: "@form") - Composants à mettre à jour
        - showRealmRoles: Boolean (défaut: true) - Afficher les rôles Realm
        - showClientRoles: Boolean (défaut: true) - Afficher les rôles Client
        - formId: String (défaut: "roleAssignmentForm") - ID du formulaire
        - useParentForm: Boolean (défaut: false) - Utiliser le formulaire parent
        
        Exemples d'utilisation:
        
        1. Attribution dans un formulaire standalone:
        <ui:include src="/templates/components/role-management/role-assignment.xhtml">
            <ui:param name="user" value="#{userBean.selectedUser}" />
            <ui:param name="availableRoles" value="#{roleBean.availableRoles}" />
            <ui:param name="userRoles" value="#{userBean.userRoles}" />
        </ui:include>
        
        2. Attribution dans un formulaire existant:
        <ui:include src="/templates/components/role-management/role-assignment.xhtml">
            <ui:param name="user" value="#{userBean.selectedUser}" />
            <ui:param name="availableRoles" value="#{roleBean.availableRoles}" />
            <ui:param name="userRoles" value="#{userBean.userRoles}" />
            <ui:param name="useParentForm" value="true" />
        </ui:include>
    -->

    <c:set var="formId" value="#{empty formId ? 'roleAssignmentForm' : formId}" />
    <c:set var="update" value="#{empty update ? '@form' : update}" />
    <c:set var="showRealmRoles" value="#{empty showRealmRoles ? true : showRealmRoles}" />
    <c:set var="showClientRoles" value="#{empty showClientRoles ? true : showClientRoles}" />
    <c:set var="useParentForm" value="#{empty useParentForm ? false : useParentForm}" />

    <!-- Contenu du composant (utilisable avec ou sans form wrapper) -->
    <c:choose>
        <c:when test="#{useParentForm}">
            <ui:fragment>
                <ui:include src="/templates/components/role-management/role-assignment-content.xhtml">
                    <ui:param name="user" value="#{user}" />
                    <ui:param name="availableRoles" value="#{availableRoles}" />
                    <ui:param name="userRoles" value="#{userRoles}" />
                    <ui:param name="update" value="#{update}" />
                    <ui:param name="showRealmRoles" value="#{showRealmRoles}" />
                    <ui:param name="showClientRoles" value="#{showClientRoles}" />
                </ui:include>
            </ui:fragment>
        </c:when>
        <c:otherwise>
            <h:form id="#{formId}">
                <ui:include src="/templates/components/role-management/role-assignment-content.xhtml">
                    <ui:param name="user" value="#{user}" />
                    <ui:param name="availableRoles" value="#{availableRoles}" />
                    <ui:param name="userRoles" value="#{userRoles}" />
                    <ui:param name="update" value="#{update}" />
                    <ui:param name="showRealmRoles" value="#{showRealmRoles}" />
                    <ui:param name="showClientRoles" value="#{showClientRoles}" />
                </ui:include>
            </h:form>
        </c:otherwise>
    </c:choose>

</ui:composition>