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

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

/**
 * Type d'action effectuée sur une ressource
 * Utilisé pour l'audit trail
 */
@Getter
@RequiredArgsConstructor
@Schema(description = "Type d'action pour l'audit")
public enum TypeActionAudit {

    // Actions Utilisateur
    USER_CREATE("Création utilisateur", "USER", "CREATE"),
    USER_UPDATE("Modification utilisateur", "USER", "UPDATE"),
    USER_DELETE("Suppression utilisateur", "USER", "DELETE"),
    USER_ACTIVATE("Activation utilisateur", "USER", "ACTIVATE"),
    USER_DEACTIVATE("Désactivation utilisateur", "USER", "DEACTIVATE"),
    USER_SUSPEND("Suspension utilisateur", "USER", "SUSPEND"),
    USER_UNLOCK("Déverrouillage utilisateur", "USER", "UNLOCK"),
    USER_PASSWORD_RESET("Réinitialisation mot de passe", "USER", "PASSWORD_RESET"),
    USER_EMAIL_VERIFY("Vérification email", "USER", "EMAIL_VERIFY"),
    USER_FORCE_LOGOUT("Déconnexion forcée", "USER", "FORCE_LOGOUT"),

    // Actions Rôle
    ROLE_CREATE("Création rôle", "ROLE", "CREATE"),
    ROLE_UPDATE("Modification rôle", "ROLE", "UPDATE"),
    ROLE_DELETE("Suppression rôle", "ROLE", "DELETE"),
    ROLE_ASSIGN("Attribution rôle", "ROLE", "ASSIGN"),
    ROLE_REVOKE("Révocation rôle", "ROLE", "REVOKE"),
    ROLE_ADD_COMPOSITE("Ajout rôle composite", "ROLE", "ADD_COMPOSITE"),
    ROLE_REMOVE_COMPOSITE("Retrait rôle composite", "ROLE", "REMOVE_COMPOSITE"),

    // Actions Groupe
    GROUP_CREATE("Création groupe", "GROUP", "CREATE"),
    GROUP_UPDATE("Modification groupe", "GROUP", "UPDATE"),
    GROUP_DELETE("Suppression groupe", "GROUP", "DELETE"),
    GROUP_ADD_MEMBER("Ajout membre groupe", "GROUP", "ADD_MEMBER"),
    GROUP_REMOVE_MEMBER("Retrait membre groupe", "GROUP", "REMOVE_MEMBER"),

    // Actions Realm
    REALM_SYNC("Synchronisation realm", "REALM", "SYNC"),
    REALM_EXPORT("Export realm", "REALM", "EXPORT"),
    REALM_IMPORT("Import realm", "REALM", "IMPORT"),

    // Actions Session
    SESSION_CREATE("Création session", "SESSION", "CREATE"),
    SESSION_DELETE("Suppression session", "SESSION", "DELETE"),
    SESSION_REVOKE_ALL("Révocation toutes sessions", "SESSION", "REVOKE_ALL"),

    // Actions Système
    SYSTEM_BACKUP("Sauvegarde système", "SYSTEM", "BACKUP"),
    SYSTEM_RESTORE("Restauration système", "SYSTEM", "RESTORE"),
    SYSTEM_CONFIG_CHANGE("Modification configuration", "SYSTEM", "CONFIG_CHANGE");

    private final String libelle;
    private final String ressourceType;
    private final String actionType;

    /**
     * Détermine si l'action concerne un utilisateur
     */
    public boolean isUserAction() {
        return ressourceType.equals("USER");
    }

    /**
     * Détermine si l'action concerne un rôle
     */
    public boolean isRoleAction() {
        return ressourceType.equals("ROLE");
    }

    /**
     * Détermine si l'action est une création
     */
    public boolean isCreateAction() {
        return actionType.equals("CREATE");
    }

    /**
     * Détermine si l'action est une modification
     */
    public boolean isUpdateAction() {
        return actionType.equals("UPDATE");
    }

    /**
     * Détermine si l'action est une suppression
     */
    public boolean isDeleteAction() {
        return actionType.equals("DELETE");
    }

    /**
     * Détermine si l'action est critique (nécessite alerte)
     */
    public boolean isCritical() {
        return this == USER_DELETE
            || this == ROLE_DELETE
            || this == USER_SUSPEND
            || this == SESSION_REVOKE_ALL
            || this == SYSTEM_RESTORE;
    }
}
