Request.get(db, function(err, req, body) {
  var end_sequence = JSON.parse(body).update_seq;
  var results = [];
  changes(function(change, done) {
    if (change.seq >= end_sequence) {
      fs.writeFileSync("results.txt", JSON.stringify(results, null, 2))
      process.exit(0);
    }
    if (change.doc.name && change.doc.readme && change.doc.versions && change.doc.time) {
      console.log("checking:" + change.doc.name);
      if(Object.keys(change.doc.versions).length <= 1) {
        var hit = {
          "name": change.doc.name,
          "last updated": change.doc.time.modified.slice(0, 10),
          "num updates": Object.keys(change.doc.versions).length
        }
        results.push(hit);
      }
    }
    done();
  }, {
    db: db,
    include_docs: true,
    now:false
  })
});
Request.get(db, function(err, req, body) {
  var end_sequence = JSON.parse(body).update_seq;
  var results = [];
  changes(function(change, done) {
    if (change.seq >= end_sequence) {
      fs.writeFileSync("results.txt", JSON.stringify(results, null, 2))
      process.exit(0);
    }
    if (change.doc.name && change.doc.readme) {
      console.log("checking:" + change.doc.name);
      for(var i = 0; i < bad_words.length; i++) {
        if (JSON.stringify(change.doc.readme).match(bad_words[i])) {
          console.log("found " + bad_words[i]);
          var hit = {
            "name":  change.doc.name,
            "word": bad_words[i]
          };
          results.push(hit);
        }
      }
    }
    done();
  }, {
    db: db,
    include_docs: true,
    now:false
  })
});
module.exports = function (handler, config) {
  if (!config.scan || !config.check) {
    throw new Error('please pass a db to scan and a cb to validate against')
  }

  var endSeq
  updateSeq(config.scan, function (err, seq) {
    if (!seq) throw new Error('failed to read sequence id from scan db ' + config.scan + '\n' + err)

    endSeq = seq
    console.log('ending at sequence ', endSeq)
  })

  var ended = false

  var stream = ccf(function (data, cb) {
    var doc = normalize(data.doc)
    // not a package.
    if (!doc) return cb()
    if (ended) return cb()

    if (data.seq >= endSeq) {
      ended = true
      console.log('reached ' + endSeq + ' done')
      stream.end()
    }

    doc.name = doc.name || doc._id

    fetchPackage(config.check, doc.name, config.sharedFetchSecret, function (err, checkDoc) {
      var output = {
        name: doc.name,
        versions: [],
        scan: data.doc,
        check: checkDoc
      }

      if (err) {
        output.error = err
        if (err.statusCode === 404) {
          // no action probably. but send to the handler for logging?
          // output.missing = true
          return cb()
        }

        handler(output, cb)
        return
      }

      Object.keys(checkDoc.versions || {}).forEach(function (version) {
        if (!doc.versions[version]) {
          output.versions.push(version)
        }
      })

      if (output.versions.length) {
        return handler(output, cb)
      }

      // nothing wrong.
      cb()
    })
  }, {
    db: config.scan,
    since: 0,
    include_docs: true,
    sequence: function (seq, cb) {
      // dont save sequence.
      stream.sequence = seq
      cb()
    }
  })

  stream.on('error', function (err) {
    if ((err + '').indexOf('premature') > -1) {
      console.log('[error] unexpected error on scan stream.')
    }
  })

  return stream
}