

from mongoengine import StringField, ListField
 
from app.models.base import TimestampedMixin

class Role(TimestampedMixin):
    """
    Role model for defining user roles and permissions.

    Attributes:
        name (str): The name of the role (required).
        description (str): A description of the role.
    Methods:
        __str__(): Return the name of the role as a string representation.
        add_permission(permission: str): Add a permission to the role.
        remove_permission(permission: str): Remove a permission from the role.
        get_permissions(): Get the list of permissions associated with the role.
        to_dict(): Convert the role object to a dictionary.
    """

    name        = StringField(required=True, help_text="The name of the role.")
    description = StringField(help_text="A description of the role.")
    permissions = ListField(StringField(max_length=50), help_text="A list of permissions associated with the role.")


    def __str__(self):
        """
        Return the name of the role as a string representation.

        Returns:
            str: The name of the role.
        """
        return self.name
    
    def add_permission(self, permission: str):
        """
        Add a permission to the role.

        Args:
            permission (str): The permission to add.

        Returns:
            None
        """
        if permission not in self.permissions:
            self.permissions.append(permission)

    def remove_permission(self, permission: str):
        """
        Remove a permission from the role.

        Args:
            permission (str): The permission to remove.

        Returns:
            None
        """
        if permission in self.permissions:
            self.permissions.remove(permission)

    def get_permissions(self):
        """
        Get the list of permissions associated with the role.

        Returns:
            list: A list of permissions.
        """
        return self.permissions
    
    def to_dict(self):
        """
        Convert the document to a dictionary.
        """ 
        role_dict = super(Role, self).to_dict() 

        role_dict.pop('id', None) 
        
        return role_dict
    

