class GrupoPermisoServicios:
    def __init__(self):
        self.grupoPermisoCrud = GrupoPermisoCrud()

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

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

    def getDTO(self, grupoPermiso):
        grupoPermisoDTO = PersonaPermisoDTO(grupoPermiso)
        return grupoPermisoDTO.toJSON()

    def insert(self, grupoPermiso):
        return self.grupoPermisoCrud.create(grupoPermiso)

    def update(self, grupoPermiso):
        return self.grupoPermisoCrud.update(grupoPermiso)

    def delete(self, grupoPermiso):
        return self.grupoPermisoCrud.delete(grupoPermiso)

    # endregion

    def getPermisosForGrupo(self, grupo):
        permisos = self.grupoPermisoCrud.whereList(grupo=grupo)
        return permisos

    def validarExistenciaPermiso(self, permisoGrupo):
        permiso = self.grupoPermisoCrud.whereObject(rol=permisoGrupo.rol, grupo=permisoGrupo.grupo.id,permiso=permisoGrupo.permiso.id)
        return permiso
 def __init__(self):
     self.grupoPermisoCrud = GrupoPermisoCrud()
 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