<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: Bouton Action Utilisateur - Écosystème LionsDev
        
        Auteur: Lions User Manager
        Version: 2.0.0
        Description: Bouton générique pour actions utilisateur avec support complet de
                     navigation (outcome), d'action serveur (action), et d'action client (onclick).
                     Supporte aussi le mode icon-only, les tooltips et les confirmations.
        
        Paramètres:
        - value: String (requis) - Texte du bouton
        - icon: String (optionnel) - Classe d'icône PrimeIcons complète (ex: "pi pi-user-plus")
        - hasAction: Boolean (défaut: false) - Indique si une action serveur est fournie
        - action: MethodExpression (optionnel) - Action à exécuter (requis si hasAction=true)
        - hasOutcome: Boolean (défaut: false) - Indique si un outcome est fourni
        - outcome: String (optionnel) - Page de redirection (requis si hasOutcome=true)
        - onclick: String (optionnel) - Code JavaScript à exécuter au clic
        - severity: String (défaut: "primary") - "primary", "success", "warning", "danger", "info", "secondary", "help"
        - size: String (défaut: "normal") - "small", "normal", "large"
        - disabled: Boolean (défaut: false) - Désactiver le bouton
        - update: String (optionnel) - Composants à mettre à jour
        - process: String (défaut: "@this") - Composants à traiter
        - styleClass: String (optionnel) - Classes CSS supplémentaires
        - title: String (optionnel) - Tooltip du bouton
        - iconOnly: Boolean (défaut: false) - Mode bouton icône seulement
        - outlined: Boolean (défaut: false) - Style outlined
        - rounded: Boolean (défaut: false) - Style arrondi
        - confirmMessage: String (optionnel) - Message de confirmation avant l'action
        
        Exemples d'utilisation:
        
        1. Bouton avec action serveur:
        <ui:include src="/templates/components/shared/buttons/button-user-action.xhtml">
            <ui:param name="value" value="Créer Utilisateur" />
            <ui:param name="icon" value="pi pi-user-plus" />
            <ui:param name="hasAction" value="true" />
            <ui:param name="action" value="#{userBean.createUser}" />
            <ui:param name="severity" value="success" />
        </ui:include>
        
        2. Bouton de navigation:
        <ui:include src="/templates/components/shared/buttons/button-user-action.xhtml">
            <ui:param name="value" value="Voir Profil" />
            <ui:param name="icon" value="pi pi-eye" />
            <ui:param name="hasOutcome" value="true" />
            <ui:param name="outcome" value="/pages/user-manager/users/profile" />
        </ui:include>
        
        3. Bouton icône seulement:
        <ui:include src="/templates/components/shared/buttons/button-user-action.xhtml">
            <ui:param name="value" value="Supprimer" />
            <ui:param name="icon" value="pi pi-trash" />
            <ui:param name="iconOnly" value="true" />
            <ui:param name="severity" value="danger" />
            <ui:param name="rounded" value="true" />
            <ui:param name="hasAction" value="true" />
            <ui:param name="action" value="#{userBean.delete}" />
        </ui:include>
    -->

    <c:set var="severity" value="#{empty severity ? 'primary' : severity}" />
    <c:set var="size" value="#{empty size ? 'normal' : size}" />
    <c:set var="disabled" value="#{empty disabled ? false : disabled}" />
    <c:set var="process" value="#{empty process ? '@this' : process}" />
    <c:set var="hasAction" value="#{empty hasAction ? false : hasAction}" />
    <c:set var="hasOutcome" value="#{empty hasOutcome ? false : hasOutcome}" />
    <c:set var="iconOnly" value="#{empty iconOnly ? false : iconOnly}" />
    <c:set var="outlined" value="#{empty outlined ? false : outlined}" />
    <c:set var="rounded" value="#{empty rounded ? false : rounded}" />

    <!-- Construire la classe CSS -->
    <c:set var="buttonClass" value="p-button-#{severity}" />

    <c:if test="#{size == 'small'}">
        <c:set var="buttonClass" value="#{buttonClass} p-button-sm" />
    </c:if>
    <c:if test="#{size == 'large'}">
        <c:set var="buttonClass" value="#{buttonClass} p-button-lg" />
    </c:if>
    <c:if test="#{outlined}">
        <c:set var="buttonClass" value="#{buttonClass} p-button-outlined" />
    </c:if>
    <c:if test="#{rounded}">
        <c:set var="buttonClass" value="#{buttonClass} p-button-rounded" />
    </c:if>
    <c:if test="#{iconOnly}">
        <c:set var="buttonClass" value="#{buttonClass} p-button-text" />
    </c:if>
    <c:if test="#{not empty styleClass}">
        <c:set var="buttonClass" value="#{buttonClass} #{styleClass}" />
    </c:if>

    <c:choose>
        <!-- Bouton avec action serveur -->
        <c:when test="#{hasAction}">
            <p:commandButton value="#{iconOnly ? '' : value}" icon="#{not empty icon ? icon : ''}"
                styleClass="#{buttonClass}" disabled="#{disabled}" action="#{action}"
                update="#{not empty update ? update : '@form'}" process="#{process}"
                onclick="#{not empty onclick ? onclick : ''}"
                title="#{not empty title ? title : (iconOnly ? value : '')}">
                <c:if test="#{not empty confirmMessage}">
                    <p:confirm header="Confirmation" message="#{confirmMessage}" icon="pi pi-exclamation-triangle" />
                </c:if>
            </p:commandButton>
        </c:when>

        <!-- Bouton avec navigation -->
        <!-- Bouton avec navigation -->
        <c:when test="#{hasOutcome}">
            <p:button value="#{iconOnly ? '' : value}" icon="#{not empty icon ? icon : ''}" styleClass="#{buttonClass}"
                disabled="#{disabled}" outcome="#{outcome}"
                title="#{not empty title ? title : (iconOnly ? value : '')}">
                <c:if test="#{not empty paramUserId}">
                    <f:param name="userId" value="#{paramUserId}" />
                </c:if>
                <c:if test="#{not empty paramRealm}">
                    <f:param name="realm" value="#{paramRealm}" />
                </c:if>
            </p:button>
        </c:when>

        <!-- Bouton client-side (onclick uniquement) -->
        <c:when test="#{not empty onclick}">
            <p:commandButton value="#{iconOnly ? '' : value}" icon="#{not empty icon ? icon : ''}"
                styleClass="#{buttonClass}" disabled="#{disabled}" type="button" onclick="#{onclick}"
                title="#{not empty title ? title : (iconOnly ? value : '')}" />
        </c:when>

        <!-- Bouton sans action définie (désactivé avec tooltip) -->
        <c:otherwise>
            <p:commandButton value="#{iconOnly ? '' : value}" icon="#{not empty icon ? icon : ''}"
                styleClass="#{buttonClass}" disabled="true"
                title="#{not empty title ? title : 'Aucune action définie'}" />
        </c:otherwise>
    </c:choose>

</ui:composition>