class PersonaPermisoServicios:

    def __init__(self):
        self.personaPermisoCrud= PersonaPermisoCrud()

# region Servicios Basicos
    def get(self, id):
        return self.personaPermisoCrud.readId(id)

    def getAll(self):
        return self.personaPermisoCrud.readAll()

    def getDTO(self, personaPermiso):
        personaPermisoDTO= PersonaPermisoDTO(personaPermiso)
        return personaPermisoDTO.toJSON()

    def insert(self, personaPermiso):
        return self.personaPermisoCrud.create(personaPermiso)

    def update(self, personaPermiso):
        return self.personaPermisoCrud.update(personaPermiso)

    def delete(self, personaPermiso):
        return self.personaPermisoCrud.delete(personaPermiso)
# endregion

    def getPermisosForPersona(self,persona):
        permisos = self.personaPermisoCrud.whereList(usuario=persona)
        return permisos

    def validarExistenciaPermiso(self, permisoPersona):
        permiso = self.personaPermisoCrud.whereObject(rol=permisoPersona.rol, usuario=permisoPersona.usuario.id,permiso=permisoPersona.permiso.id)
        return permiso
 def __init__(self):
     self.personaPermisoCrud= PersonaPermisoCrud()
 def __init__(self):
     self.permisoCrud= PermisoCrud()
     self.grupoPermisoCrud= GrupoPermisoCrud()
     self.personaPermisoCrud= PersonaPermisoCrud()
     self.grupoCrud=GrupoCrud()
     self.personaCrud= PersonaCrud()
class PermisoServicios:

    def __init__(self):
        self.permisoCrud= PermisoCrud()
        self.grupoPermisoCrud= GrupoPermisoCrud()
        self.personaPermisoCrud= PersonaPermisoCrud()
        self.grupoCrud=GrupoCrud()
        self.personaCrud= PersonaCrud()

# region Servicios Basicos
    def get(self, id):
        return self.permisoCrud.readId(id)

    def getAll(self):
        return self.permisoCrud.readAll()

    def getDTO(self, permiso):
        permisoDTO= PermisoDTO(permiso)
        return permisoDTO.toJSON()

    def insert(self, permiso):
        return self.permisoCrud.create(permiso)

    def update(self, permiso):
        return self.permisoCrud.update(permiso)

    def delete(self, permiso):
        return self.permisoCrud.delete(permiso)
# endregion

    def listar(self):
        permisos = Permiso.objects.all()
        return  permisos

    def getPermisoByUserAndUrl(self, user, path):
        """
        Método que verifica si un usuario tiene relacionado un permiso ya sea por grupo o por usuario. Realiza una
        búsqueda hacia arriba buscando en los padres aplanando la autorización.
        :param userId: Usuario en sesión.
        :param path: url del método a ingresar
        :return: Permiso asociado.
        """
        permiso= self.permisoCrud.whereObject(path=path)
        usuario= self.personaCrud.whereObject(usuario=user)

        perm = self.personaPermisoCrud.whereList(permiso=permiso, usuario=usuario)

        #Si no se encuentra aplanado se busca en los padres.
        if not perm :
            while permiso.parent is not None:
                permiso=permiso.parent
                perm = self.personaPermisoCrud.whereList(permiso=permiso, usuario=usuario)
                if not perm:
                    break

        #Si al finalizar en los padres no encuentra continua buscando en los grupos.
        if not perm:
            permiso= self.permisoCrud.whereObject(path=path)
            grupos= self.grupoCrud.whereList(personas=usuario)
            perm= self.grupoPermisoCrud.whereList(grupo__in=grupos, permiso=permiso)

            while permiso.parent is not None:
                permiso=permiso.parent
                perm= self.grupoPermisoCrud.whereList(grupo__in=grupos, permiso=permiso)
                if not perm:
                    break

        return perm