Show:
import Ember from 'ember';

export default Ember.Controller.extend({
  /**
    Current store.

    @property store
    @type DS.Store
    @readOnly
  */
  store: Ember.inject.service('store'),

  /**
    Generation log records array.

    @property generationLog
    @type Array
    @readOnly
  */
  generationLog: Ember.A(),

  /**
    Current generation object.

    @property currentGeneration
    @type Object
  */
  currentGeneration: null,

  /**
    Sorted generation log records array.

    @property sortedGenerationLog
    @type Array
  */
  sortedGenerationLog: Ember.computed('currentGeneration.stepLogs.[]', function() {
    let stepLogs = this.get('currentGeneration.stepLogs') || Ember.A();
    return stepLogs.sortBy('time');
  }),

  currentProjectContext: Ember.inject.service('fd-current-project-context'),

  generationService: Ember.inject.service('fd-generation'),

  actions: {
    /**
      Handler for click on generate button.

      @method actions.generate
     */
    generate() {
      this.set('state', 'loading');
      let _this = this;
      let stagePk = _this.get('currentProjectContext').getCurrentStage();
      let host = _this.get('store').adapterFor('application').host;
      Ember.$.ajax({
        type: 'GET',
        xhrFields: { withCredentials: true },
        url: `${host}/Generate(project=${stagePk})`,
        success(result) {
          _this.set('generationService.lastGenerationToken', result);
          _this.transitionToRoute('fd-generation-process-form', Ember.get(result, 'value'));
        },
        error() {
          _this.set('state', '');
          _this.set('error', new Error(_this.get('i18n').t('forms.fd-generation-process-form.connection-error-text')));
        },
      });
    }
  },

  /**
    Update generation log records array.

    @method generationLogUpdate
    @param {Integer} interval Interval for sending OData requests
   */
  generationLogUpdate(interval) {
    let modelName = this.get('modelName');
    let modelProjection = this.get('modelProjection');
    let modelId = this.get('generationId');
    let _this = this;
    if (modelName && modelProjection && modelId) {
      this.store.findRecord(modelName, modelId, { projection: modelProjection }).then(record => {
        if (!Ember.isNone(record)) {
          _this.set('currentGeneration', record);
          Ember.$('.generation-progress-bar').progress({
            text: {
              active: '{percent}%',
              success: '{percent}%'
            }
          }).progress('set percent', record.get('percentComplete'));
          if (!record.get('isRunning')) {
            return;
          }
        }

        Ember.run.later(_this, function() {
          let currentModelId = _this.get('generationId');
          if (modelId === currentModelId) {
            _this.generationLogUpdate(interval);
          }
        }, interval);
      });
    }
  }
});