/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import Ember from 'ember';

import AbstractRoute from './abstract';
import ErrorUtils from 'yarn-ui/utils/error-utils';

export default AbstractRoute.extend({
  model: function(params) {
    return Ember.RSVP.hash({
      flowrun: this.store.findRecord('yarn-flowrun', params.flowrun_uid),
      apps: this.store.query('yarn-app-flowrun', {flowrunUid: params.flowrun_uid}),
      flowrun_uid: params.flowrun_uid,
      parentFlowUid: this.getParentFlowUid()
    });
  },

  getParentFlowUid: function() {
    var parentFlowModel = this.modelFor('yarn-flow');
    if (parentFlowModel) {
      return parentFlowModel.flowUid;
    } else {
      return '';
    }
  },

  unloadAll: function() {
    this.store.unloadAll('yarn-flowrun');
    this.store.unloadAll('yarn-app-flowrun');
  },

  actions: {
    reload: function() {
      this.modelFor('apps').reload();
    },

    error(err/*, transition*/) {
      var errObj = ErrorUtils.stripErrorCodeAndMessageFromError(err);
      this.transitionTo('timeline-error', errObj);
    }
  }
});
