ERole.java

package com.ctrlbuy.webshop.security.entity;

/**
 * ✅ UPPDATERAD: ERole enum med utility-metoder och kompatibilitet
 */
public enum ERole {
    ROLE_USER("USER", "Standard användare"),
    ROLE_MODERATOR("MODERATOR", "Moderator med begränsade admin-rättigheter"),
    ROLE_ADMIN("ADMIN", "Administratör med fulla rättigheter");

    private final String roleName;
    private final String description;

    // ✅ Konstruktor
    ERole(String roleName, String description) {
        this.roleName = roleName;
        this.description = description;
    }

    // ✅ Getters
    public String getRoleName() {
        return roleName;
    }

    public String getDescription() {
        return description;
    }

    // ✅ UTILITY METODER för kompatibilitet med User entity

    /**
     * Konvertera från String (som används i User.roles) till ERole
     */
    public static ERole fromString(String roleStr) {
        if (roleStr == null) {
            return ROLE_USER; // Default
        }

        // Hantera både "ROLE_USER" och "USER" format
        String cleanRole = roleStr.toUpperCase();
        if (!cleanRole.startsWith("ROLE_")) {
            cleanRole = "ROLE_" + cleanRole;
        }

        try {
            return ERole.valueOf(cleanRole);
        } catch (IllegalArgumentException e) {
            return ROLE_USER; // Default vid ogiltigt värde
        }
    }

    /**
     * Konvertera till String-format som används i User.roles
     */
    public String toRoleString() {
        return this.roleName; // Returnerar "USER", "ADMIN", etc.
    }

    /**
     * Konvertera till fullständigt roll-namn
     */
    public String toFullRoleName() {
        return this.name(); // Returnerar "ROLE_USER", "ROLE_ADMIN", etc.
    }

    /**
     * Kontrollera om denna roll har högre behörighet än en annan
     */
    public boolean hasHigherAuthorityThan(ERole other) {
        return this.ordinal() > other.ordinal();
    }

    /**
     * Kontrollera om denna roll har minst samma behörighet som en annan
     */
    public boolean hasAtLeastAuthorityOf(ERole other) {
        return this.ordinal() >= other.ordinal();
    }

    /**
     * Kontrollera om denna roll är admin eller högre
     */
    public boolean isAdminOrHigher() {
        return this == ROLE_ADMIN;
    }

    /**
     * Kontrollera om denna roll är moderator eller högre
     */
    public boolean isModeratorOrHigher() {
        return this == ROLE_MODERATOR || this == ROLE_ADMIN;
    }

    /**
     * Hämta alla roller som String-lista (för User.roles kompatibilitet)
     */
    public static String[] getAllRoleNames() {
        return new String[]{"USER", "MODERATOR", "ADMIN"};
    }

    /**
     * Validera om en roll-string är giltig
     */
    public static boolean isValidRole(String roleStr) {
        try {
            fromString(roleStr);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    @Override
    public String toString() {
        return this.roleName;
    }
}