from application_tpl.ext.database import db
from application_tpl.models.utils import ModelCRUD


class Role(db.Document):
    name = db.StringField(max_length=80, unique=True)
    description = db.StringField(max_length=255)

    def __repr__(self):
        return "<Role {}>".format(self.name)


class User(db.Document, ModelCRUD):
    email = db.StringField(max_length=255)
    password = db.StringField(max_length=255)
    active = db.BooleanField(default=True)
    roles = db.ListField(db.ReferenceField(Role), default=[])

    def __repr__(self):
        return "<User {}>".format(self.email)

    @classmethod
    def get_by_email(cls, email):
        return User.objects.get(email=email)

    def has_roles(self, *roles_required):
        roles = set(roles_required)
        user_roles = set([role.name for role in self.roles])
        return roles.issubset(user_roles)

    def has_any_roles(self, *roles_accepted):
        roles = set(roles_accepted)
        user_roles = set([role.name for role in self.roles])
        return not set(user_roles).isdisjoint(roles)
