var Readable = require('readable-stream').Readable;

function identity (_in) {
  return _in;
}

/**
 * Returns a stream for any paged AWS function
 * you can optionally provide a mapping function
 * like S3::listObjectsV2()
 *
 * @param {function} req - a non executed AWS function
 * @param {function} fn - a function that selects/maps the results
 * @param {object} opts - stream options
 */
function s3PageStream (req, fn, opts) {
  opts = Object.assign({}, opts, { read, objectMode: true });
  if (!fn) fn = identity;

  var stream = new Readable(opts);

  return stream;

  function read () {
    if (!req) return;

    var _req = req;
    req = null; // poor man's once!
    _req.send(page_handler);
  }

  function page_handler (e, data) {
    if (e) return stream.destroy(e);
    data.Contents.forEach((obj) => {
      stream.push(fn(obj));
    });

    var nextPage = this.hasNextPage() ? this.nextPage() : null;
    if (nextPage) nextPage.send(page_handler);
    else stream.push(null);
  }
}