import Ember from 'ember';

export default Ember.Mixin.create({
  polling: Ember.inject.service(),

  init() {
    this.set('currentPollModels', {});

    return this._super(...arguments);
  },

  didInsertElement() {
    this._super.apply(this, arguments);
    return this.startPolling();
  },

  willDestroyElement() {
    this._super.apply(this, arguments);
    return this.stopPolling();
  },

  pollModelDidChange(sender, key, value) {
    return this.pollModel(key);
  },

  pollModel(property) {
    var model = this.get(property),
        currentPollModels = this.get('currentPollModels');

    if(currentPollModels[property]) {
      this.get('polling').stopPolling(currentPollModels[property]);
    }
    currentPollModels[property] = model;

    var addToPolling = () => {
      return this.get('polling').startPolling(model);
    };

    if (model) {
      if (model.then) {
        return model.then(function(resolved) {
          return addToPolling(resolved);
        });
      } else {
        return addToPolling(model);
      }
    }
  },

  stopPollingModel(property) {
    var model = this.get(property);
    if (model) {
      return this.get('polling').stopPolling(model);
    }
  },

  startPolling() {
    var pollModels;
    pollModels = this.get('pollModels');
    if (pollModels) {
      if (!Ember.isArray(pollModels)) {
        pollModels = [pollModels];
      }
      pollModels.forEach( (property) => {
        this.pollModel(property);
        this.addObserver(property, this, 'pollModelDidChange');
      });
    }
    if (this.pollHook) {
      return this.get('polling').startPollingHook(this);
    }
  },

  stopPolling() {
    var pollModels = this.get('pollModels');

    if (pollModels) {
      if (!Ember.isArray(pollModels)) {
        pollModels = [pollModels];
      }
      pollModels.forEach( (property) => {
        this.stopPollingModel(property);
        this.removeObserver(property, this, 'pollModelDidChange');
      });
    }
    return this.get('polling').stopPollingHook(this);
  }
});