<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 (WOU/DRY Pattern)
        
        Auteur: Lions User Manager
        Version: 1.0.0
        Description: Interface pour attribuer/révoquer des rôles à un utilisateur
        
        Paramètres:
        - user: UserDTO (requis) - L'utilisateur concerné
        - availableRoles: List&lt;RoleDTO&gt; (requis) - Liste des rôles disponibles
        - userRoles: List&lt;RoleDTO&gt; (requis) - Liste des rôles de l'utilisateur
        - roleBean: String (optionnel) - Nom du bean pour les actions (défaut: "roleGestionBean")
        - 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
        
        Exemples d'utilisation:
        
        1. Attribution simple:
        <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="assignAction" value="#{roleBean.assignRole}" />
            <ui:param name="revokeAction" value="#{roleBean.revokeRole}" />
        </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="roleBeanName" value="#{empty roleBean ? 'roleGestionBean' : roleBean}" />
    
    <h:form id="#{formId}">
        <p:panel header="Attribution de rôles - #{user.username}" styleClass="w-full">
            
            <!-- Rôles actuels de l'utilisateur -->
            <h3>Rôles actuels</h3>
            <div class="flex flex-wrap gap-2 mb-4">
                <c:forEach var="userRole" items="#{userRoles}">
                    <p:tag 
                        value="#{userRole.name}" 
                        severity="info"
                        icon="pi pi-shield">
                        <p:commandButton 
                            icon="pi pi-times"
                            styleClass="p-button-text p-button-sm p-button-danger ml-2"
                            action="#{roleGestionBean.revokeRoleFromParams}"
                            update="#{update}"
                            title="Révoquer le rôle">
                            <f:param name="userId" value="#{user.id}" />
                            <f:param name="roleName" value="#{userRole.name}" />
                        </p:commandButton>
                    </p:tag>
                </c:forEach>
                <c:if test="#{empty userRoles}">
                    <span class="text-color-secondary">Aucun rôle attribué</span>
                </c:if>
            </div>
            
            <p:separator />
            
            <!-- Rôles disponibles -->
            <h3>Rôles disponibles</h3>
            
            <!-- Rôles Realm -->
            <c:if test="#{showRealmRoles}">
                <p:panel header="Rôles Realm" styleClass="mb-3">
                    <div class="flex flex-wrap gap-2">
                        <c:forEach var="role" items="#{availableRoles}">
                            <c:if test="#{role.typeRole == 'REALM_ROLE'}">
                                <c:set var="isAssigned" value="false" />
                                <c:forEach var="userRole" items="#{userRoles}">
                                    <c:if test="#{userRole.id == role.id}">
                                        <c:set var="isAssigned" value="true" />
                                    </c:if>
                                </c:forEach>
                                
                                <c:choose>
                                    <c:when test="#{isAssigned}">
                                        <p:tag 
                                            value="#{role.name}" 
                                            severity="success"
                                            icon="pi pi-check" />
                                    </c:when>
                                    <c:otherwise>
                                        <p:tag 
                                            value="#{role.name}" 
                                            severity="info"
                                            icon="pi pi-shield">
                                            <p:commandButton 
                                                icon="pi pi-plus"
                                                styleClass="p-button-text p-button-sm p-button-success ml-2"
                                                action="#{roleGestionBean.assignRoleFromParams}"
                                                update="#{update}"
                                                title="Attribuer le rôle">
                                                <f:param name="userId" value="#{user.id}" />
                                                <f:param name="roleName" value="#{role.name}" />
                                            </p:commandButton>
                                        </p:tag>
                                    </c:otherwise>
                                </c:choose>
                            </c:if>
                        </c:forEach>
                    </div>
                </p:panel>
            </c:if>
            
            <!-- Rôles Client -->
            <c:if test="#{showClientRoles}">
                <p:panel header="Rôles Client" styleClass="mb-3">
                    <div class="flex flex-wrap gap-2">
                        <c:forEach var="role" items="#{availableRoles}">
                            <c:if test="#{role.typeRole == 'CLIENT_ROLE'}">
                                <c:set var="isAssigned" value="false" />
                                <c:forEach var="userRole" items="#{userRoles}">
                                    <c:if test="#{userRole.id == role.id}">
                                        <c:set var="isAssigned" value="true" />
                                    </c:if>
                                </c:forEach>
                                
                                <c:choose>
                                    <c:when test="#{isAssigned}">
                                        <p:tag 
                                            value="#{role.name}" 
                                            severity="success"
                                            icon="pi pi-check" />
                                    </c:when>
                                    <c:otherwise>
                                        <p:tag 
                                            value="#{role.name}" 
                                            severity="info"
                                            icon="pi pi-shield">
                                            <p:commandButton 
                                                icon="pi pi-plus"
                                                styleClass="p-button-text p-button-sm p-button-success ml-2"
                                                action="#{roleGestionBean.assignRoleFromParams}"
                                                update="#{update}"
                                                title="Attribuer le rôle">
                                                <f:param name="userId" value="#{user.id}" />
                                                <f:param name="roleName" value="#{role.name}" />
                                            </p:commandButton>
                                        </p:tag>
                                    </c:otherwise>
                                </c:choose>
                            </c:if>
                        </c:forEach>
                    </div>
                </p:panel>
            </c:if>
            
            <!-- Recherche de rôles -->
            <p:separator />
            <h3>Rechercher un rôle</h3>
            <div class="flex gap-2 mb-3">
                <p:inputText 
                    value="#{roleGestionBean.roleSearchText}" 
                    placeholder="Rechercher un rôle..."
                    styleClass="flex-1">
                    <p:ajax event="keyup" 
                          delay="300"
                          update="roleSearchResults" />
                </p:inputText>
            </div>
            
            <div id="roleSearchResults" class="flex flex-wrap gap-2">
                <!-- Résultats de recherche -->
            </div>
            
        </p:panel>
    </h:form>
    
</ui:composition>

