/**
 * 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');

/**
 * Represents a configuration-group on the cluster.
 * A configuration-group is a collection of hosts
 * on which a collection of configurations are applied.
 *
 * Configuration group hierarchy is at 2 levels. For
 * each service there is a 'Default' configuration group
 * containing all hosts not belonging to any group of that
 * service.
 *
 * A default configuration group has child configuration
 * groups which contain configuration overrides (deltas)
 * for a bunch of hosts. This allows different configurations
 * for different hosts in a heterogeneous cluster environment.
 */
App.ConfigGroup = Ember.Object.extend({
  id: null,
  name: null,
  description: null,
  isDefault: null,

  /**
   * Parent configuration group for this group.
   * When {@link #isDefault} is true, this value is <code>null</code>
   * When {@link #isDefault} is false, this represents the configuration
   * deltas that are applied on the default.
   */
  parentConfigGroup: null,

  /**
   * Children configuration groups for this group.
   * When {@link #isDefault} is false, this value is <code>null</code>
   * When {@link #isDefault} is true, this represents the various
   * configuration groups that override the default.
   */
  childConfigGroups: [],

  /**
   * Service for which this configuration-group
   * is applicable.
   */
  service: null,

  /**
   * Hosts on which this configuration-group
   * is to be applied. For a service, a host can
   * belong to only one non-default configuration-group.
   *
   * When {#isDefault} is false, this contains hosts
   * for which the overrides will apply.
   *
   * When {#isDefault} is true, this value is empty, as
   * it dynamically reflects hosts not belonging to other
   * non-default groups.
   *
   */
  hosts: [],

  displayName: function () {
    return this.get('name') + ' (' + this.get('hosts.length') + ')';
  }.property('name', 'hosts.length'),

  apiResponse: null,

  /**
   * Provides hosts which are available for inclusion in
   * non-default configuration groups.
   */
  availableHosts: function () {
    if (this.get('isDefault')) return [];
    var unusedHostsMap = {};
    var availableHosts = [];
    // parentConfigGroup.hosts(hosts from default group) - are available hosts, which don't belong to any group
    this.get('parentConfigGroup.hosts').forEach(function (hostName) {
      unusedHostsMap[hostName] = true;
    });
    App.Host.find().filter(function (host) {
      if(unusedHostsMap[host.get('id')]) {
        availableHosts.pushObject(Ember.Object.create({
          selected: false,
          host: host
        }));
      }
    });
    return availableHosts;
  }.property('isDefault', 'parentConfigGroup', 'childConfigGroups', 'parentConfigGroup.hosts.@each'),

  isAddHostsDisabled: function () {
    return (this.get('isDefault') || this.get('availableHosts.length') === 0);
  }.property('availableHosts.length'),

  isDeleteHostsDisabled: function () {
    return (this.get('isDefault') || this.get('hosts.length') === 0);
  }.property('hosts.length'),

  /**
   * Collection of (site, tag) pairs representing properties.
   *
   * When {#isDefault} is true, this represents the
   * default cluster configurations for that service.
   *
   * When {#isDefault} is false, this represents the
   * configuration overrides on top of the cluster default for the
   * hosts identified by 'hosts'.
   */
  configSiteTags: [],

  properties: [],

  propertiesList: function () {
    var result = '';
    this.get('properties').forEach(function (item) {
      result += item.name + " : " + item.value + '\n';
    }, this);
    return result;
  }.property('properties.length')
});