/**
 * 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.
 */

var App = require('app');

App.Stack = DS.Model.extend({
  id: DS.attr('string'), //  ${stackName}-${stackVersion}-${repositoryVersion}.
  stackName: DS.attr('string'),
  stackVersion: DS.attr('string'),
  stackDefault: DS.attr('boolean'),
  minJdkVersion: DS.attr('string'),
  maxJdkVersion: DS.attr('string'),
  repositoryVersion: DS.attr('string'),
  showAvailable: DS.attr('boolean'),  // All of the instances should have this value to true. We should map only those stacks that has this flag set to true
  type: DS.attr('string'), // ["PATCH", "STANDARD"]
  useRedhatSatellite: DS.attr('boolean'),
  stackServices: DS.hasMany('App.ServiceSimple'),
  operatingSystems: DS.hasMany('App.OperatingSystem'),
  isSelected: DS.attr('boolean', {defaultValue: false}),

  versionInfoId: null,

  stackNameVersion: Em.computed.concat('-', 'stackName', 'stackVersion'),

  isPatch: Em.computed.equal('type', 'PATCH'),

  displayName: Em.computed.concat('-', 'stackName', 'repositoryVersion'),

  /**
   * @type {boolean}
   */
  usePublicRepo: true,

  /**
   * @type {boolean}
   */
  useLocalRepo: false,

  /**
   * @return: {Array} returns supported repositories for all OperatingSystem's supported by a stack instance
   */
  repositories: function () {
    var operatingSystems = this.get('operatingSystems');
    var repositories = [];
    operatingSystems.filterProperty('isSelected', true).forEach(function (os) {
      os.get('repositories').forEach(function (repository) {
        repositories.pushObject(repository);
      }, this);
    }, this);
    return repositories;
  }.property('operatingSystems.@each.isSelected'),

  cleanReposBaseUrls: function () {
    this.get('operatingSystems').forEach(function (os) {
      os.get('repositories').setEach('baseUrl', '');
    });
  },

  restoreReposBaseUrls: function () {
    this.get('operatingSystems').forEach(function (os) {
      os.get('repositories').forEach(function (repo) {
        repo.set('baseUrl', repo.get('baseUrlInit'));
      });
    });
  }

});


App.Stack.FIXTURES = [];
