package dev.lions.user.manager.enums.user;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.eclipse.microprofile.openapi.annotations.media.Schema;

/**
 * Statut d'un utilisateur dans Keycloak
 * Mappé depuis le champ "enabled" et attributs personnalisés
 */
@Getter
@RequiredArgsConstructor
@Schema(description = "Statut d'un utilisateur")
public enum StatutUser {

    /**
     * Utilisateur actif et opérationnel
     */
    ACTIF("Actif", "Utilisateur actif avec accès complet", true),

    /**
     * Utilisateur désactivé temporairement (peut être réactivé)
     */
    INACTIF("Inactif", "Utilisateur désactivé temporairement", false),

    /**
     * Utilisateur suspendu suite à une action administrative
     */
    SUSPENDU("Suspendu", "Compte suspendu par un administrateur", false),

    /**
     * Utilisateur en attente de validation
     */
    EN_ATTENTE("En attente", "Compte en attente de validation", false),

    /**
     * Utilisateur verrouillé suite à des tentatives échouées
     */
    VERROUILLE("Verrouillé", "Compte verrouillé suite à plusieurs échecs d'authentification", false),

    /**
     * Utilisateur dont le compte a expiré
     */
    EXPIRE("Expiré", "Compte expiré et nécessite une réactivation", false),

    /**
     * Utilisateur supprimé (soft delete)
     */
    SUPPRIME("Supprimé", "Compte supprimé logiquement", false);

    private final String libelle;
    private final String description;
    private final boolean enabled;

    /**
     * Convertit un statut Keycloak "enabled" en StatutUser
     * @param enabled état enabled de Keycloak
     * @return ACTIF si enabled=true, INACTIF sinon
     */
    public static StatutUser fromEnabled(boolean enabled) {
        return enabled ? ACTIF : INACTIF;
    }

    /**
     * Détermine si l'utilisateur peut se connecter
     * @return true si le statut permet la connexion
     */
    public boolean peutSeConnecter() {
        return this == ACTIF;
    }

    /**
     * Détermine si l'utilisateur peut être réactivé
     * @return true si le statut permet la réactivation
     */
    public boolean peutEtreReactive() {
        return this == INACTIF || this == SUSPENDU || this == EXPIRE;
    }
}
