/**
 * 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.WizardStep10Controller = Em.Controller.extend({
  name: 'wizardStep10Controller',
  clusterInfo: [],
  clearStep: function () {
    this.get('clusterInfo').clear();
  },

  loadStep: function () {
    console.log("TRACE: Loading step10: Summary Page");
    this.clearStep();
    this.loadInstalledHosts(this.loadRegisteredHosts());
    var installFlag = this.loadMasterComponents();
    var startFlag = this.loadStartedServices();
    if (installFlag && startFlag) {
      this.loadInstallTime();
    }
  },

  loadRegisteredHosts: function () {
    var masterHosts = this.get('content.masterComponentHosts').mapProperty('hostName').uniq();
    var slaveHosts = this.get('content.slaveComponentHosts');
    var hostObj = [];
    slaveHosts.forEach(function (_hosts) {
      hostObj = hostObj.concat(_hosts.hosts);
    }, this);
    slaveHosts = hostObj.mapProperty('hostName').uniq();
    var registeredHosts = masterHosts.concat(slaveHosts).uniq();
    var registerHostsStatement = registeredHosts.length + ' hosts registered to the cluster.';
    var registerHostsObj = Ember.Object.create({
      id: 1,
      color: 'text-info',
      displayStatement: registerHostsStatement,
      status: []
    });
    this.get('clusterInfo').pushObject(registerHostsObj);

    return registerHostsObj;
  },

  loadInstalledHosts: function (host) {
    var hosts = this.get('content.hostsInfo');
    var hostsInfo = [];
    for (var index in hosts) {
      hostsInfo.pushObject(hosts[index]);
      console.log('Step10 SUMMARY: value of hosts is: ' + hosts[index].status);
    }
    var succeededHosts = hostsInfo.filterProperty('status', 'success');
    var warnedHosts = hostsInfo.filterProperty('status', 'warning').concat(hostsInfo.filterProperty('status', 'failed'));
    if (succeededHosts.length) {
      var successStatement = succeededHosts.length + ' ' + ((succeededHosts.length > 1) ? 'hosts' : 'host') + ' installed and started services successfully.';
      this.get('clusterInfo').findProperty('id', 1).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-success',
        displayStatement: successStatement
      }));
    }

    if (warnedHosts.length) {
      var warnStatement = warnedHosts.length + ' warnings';
      this.get('clusterInfo').findProperty('id', 1).get('status').pushObject(Ember.Object.create({
        id: 2,
        color: 'text-warning',
        displayStatement: warnStatement,
        statements: []
      }));

      warnedHosts.forEach(function (_host) {
        var clusterState;
        console.log("Content.cluster.status is: " + this.get('content.cluster.status'));
        if (this.get('content.cluster.status') === 'INSTALL FAILED') {
          clusterState = 'Installing ';
        } else if (this.get('content.cluster.status') === 'START FAILED') {
          clusterState = 'Starting ';
        }
        console.log('host value is: ' + JSON.stringify(_host));
        var failedTasks = _host.tasks.filterProperty('Tasks.status', 'FAILED');
        failedTasks.forEach(function (_task) {
          var taskStatement = clusterState + App.format.role(_task.Tasks.role) + ' failed on ' + _host.name;
          this.get('clusterInfo').findProperty('id', 1).get('status').findProperty('id', 2).get('statements').pushObject(Ember.Object.create({
            status: 'failed',
            color: 'text-info',
            displayStatement: taskStatement
          }));
        }, this);

        var abortedTasks = _host.tasks.filterProperty('Tasks.status', 'ABORTED');
        abortedTasks.forEach(function (_task) {
          var abortStatement = clusterState + App.format.role(_task.Tasks.role) + ' aborted on ' + _host.name;
          this.get('clusterInfo').findProperty('id', 1).get('status').findProperty('id', 2).get('statements').pushObject(Ember.Object.create({
            status: 'aborted',
            color: 'text-info',
            displayStatement: abortStatement
          }));
        }, this);

        var timedOutTasks = _host.tasks.filterProperty('Tasks.status', 'TIMEDOUT');
        timedOutTasks.forEach(function (_task) {
          var timedOutStatement = clusterState + App.format.role(_task.Tasks.role) + ' timed out on ' + _host.name;
          this.get('clusterInfo').findProperty('id', 1).get('status').findProperty('id', 2).get('statements').pushObject(Ember.Object.create({
            status: 'timedout',
            color: 'text-info',
            displayStatement: timedOutStatement
          }));
        }, this);
      }, this);
    }
  },

  loadMasterComponents: function () {
    var components = this.get('content.masterComponentHosts');
    var statement;
    if (this.get('content.cluster.status') === 'INSTALL FAILED') {
      this.get('clusterInfo').pushObject(Ember.Object.create({
        id: 2,
        displayStatement: 'Installing master services failed',
        color: 'text-error',
        status: []
      }));
      return false;
    } else {
      this.get('clusterInfo').pushObject(Ember.Object.create({
        id: 2,
        displayStatement: 'Master services installed',
        color: 'text-success',
        status: []
      }));
    }

    console.log('STEP10 master components:  ' + JSON.stringify(components));
    components.forEach(function (_component) {
      var component = Ember.Object.create(_component);
      switch (component.component) {
        case 'NAMENODE':
          this.loadNn(component);
          break;
        case 'SECONDARY_NAMENODE':
          this.loadSnn(component);
          break;
        case 'JOBTRACKER' :
          this.loadJt(component);
          break;
        case 'ZOOKEEPER_SERVER' :
          // TODO: Fix this; redundant entries and wrong number
          //this.loadZk(component);
          break;
        case 'HBASE_MASTER':
          this.loadHb(component);
          break;
        case 'HIVE_SERVER':
          this.loadHiveServer(component);
          break;
        case 'OOZIE_SERVER':
          this.loadOozieServer(component);
          break;
        case 'GANGLIA_SERVER':
          this.loadGanglia(component)
          break;
        case 'NAGIOS_SERVER':
          this.loadNagios(component);
          break;
      }
    }, this);
    return true;
  },

  loadNn: function (component) {
    if (component.get('hostName')) {
      var statement = 'NameNode installed on ' + component.get('hostName');
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to NameNode component');
    }
  },

  loadSnn: function (component) {
    if (component.get('hostName')) {
      var statement = 'SecondaryNameNode installed on ' + component.get('hostName');
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to SecondaryNameNode component');
    }
  },

  loadJt: function (component) {
    if (component.get('hostName')) {
      var statement = 'JobTracker installed on ' + component.get('hostName');
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to JobTracker component');
    }
  },

  loadZk: function (component) {
    var hostLength = component.get('hostName').length;
    if (hostLength) {
      var hostVal;
      if (hostLength === 1) {
        hostVal = 'host';
      } else {
        hostVal = 'hosts';
      }
      var statement = 'ZooKeeper installed on ' + component.get('hostName').length + ' ' + hostVal;
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to Zookeeper component');
    }
  },

  loadHb: function (component) {
    if (component.get('hostName')) {
      var statement = 'HBase Master installed on ' + component.get('hostName');
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to HBase Master component');
    }
  },

  loadHiveServer: function (component) {
    if (component.get('hostName')) {
      var statement = 'Hive Metastore installed on ' + component.get('hostName');
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to Hive server component');
    }
  },

  loadOozieServer: function (component) {
    if (component.get('hostName')) {
      var statement = 'Oozie Server installed on ' + component.get('hostName');
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to Oozie server component');
    }
  },

  loadGanglia: function (component) {
    if (component.get('hostName')) {
      var statement = 'Ganglia Server installed on ' + component.get('hostName');
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to Ganglia server component');
    }
  },

  loadNagios: function (component) {
    if (component.get('hostName')) {
      var statement = 'Nagios Server installed on ' + component.get('hostName');
      this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Ember.Object.create({
        id: 1,
        color: 'text-info',
        displayStatement: statement
      }));
    } else {
      console.log('ERROR: no host name assigned to Nagios server component');
    }
  },

  loadStartedServices: function (component) {
    if (this.get('content.cluster.status') === 'STARTED') {
      var statement = 'All services started';
      this.get('clusterInfo').pushObject(Ember.Object.create({
        id: 3,
        color: 'text-success',
        displayStatement: 'All services started',
        status: []
      }));
      this.get('clusterInfo').pushObject(Ember.Object.create({
        id: 4,
        color: 'text-success',
        displayStatement: 'All tests passed',
        status: []
      }));
      return true;
    } else {
      this.get('clusterInfo').pushObject(Ember.Object.create({
        id: 3,
        color: 'text-error',
        displayStatement: 'Starting services failed',
        status: []
      }));
      return false;
    }
  },

  loadInstallTime: function () {
    var secondsPerMinute = 60;
    var statement;
    if (this.get('content.cluster.installTime')) {
      var minutes = Math.floor(this.get('content.cluster.installTime'));
      var seconds = Math.floor((this.get('content.cluster.installTime') - minutes) * secondsPerMinute);
      var statement;
      if (minutes !== 0) {
        statement = 'Install and start of all services completed in ' + minutes + ' minutes and ' + seconds + ' seconds';
      } else {
        statement = 'Install and start of all services completed in ' + seconds + ' seconds';
      }
      this.get('clusterInfo').pushObject(Ember.Object.create({
        id: 5,
        color: 'text-info',
        displayStatement: statement,
        status: []
      }));
    }
  }
});

