const EventEmitter = require('events');

module.exports = function (dependencies) {
  const Client = dependencies.Client;

  function Provider(options) {
    if (false === this instanceof Provider) {
      return new Provider(options);
    }

    this.client = new Client(options);

    EventEmitter.call(this);
  }

  Provider.prototype = Object.create(EventEmitter.prototype);

  Provider.prototype.send = function send(notification, recipients) {
    const builtNotification = {
      headers: notification.headers(),
      body: notification.compile(),
    };

    if (!Array.isArray(recipients)) {
      recipients = [recipients];
    }

    return Promise.all(recipients.map(token => this.client.write(builtNotification, token))).then(
      responses => {
        const sent = [];
        const failed = [];

        responses.forEach(response => {
          if (response.status || response.error) {
            failed.push(response);
          } else {
            sent.push(response);
          }
        });
        return { sent, failed };
      }
    );
  };

  Provider.prototype.shutdown = function shutdown(callback) {
    this.client.shutdown(callback);
  };

  return Provider;
};
