/**
 * © OpenCORD
 *
 * Visit http://guide.xosproject.org/devguide/addview/ for more information
 *
 * Created by teone on 3/21/16.
 */

(function () {
  'use strict';

  angular.module('xos.ceilometerDashboard')
  .directive('ceilometerSamples', function(lodash, $stateParams){
    return {
      restrict: 'E',
      scope: {},
      bindToController: true,
      controllerAs: 'vm',
      templateUrl: 'templates/ceilometer-samples.tpl.html',
      controller: function(Ceilometer) {

        // console.log(Ceilometer.selectResource);

        this.chartColors = [
          '#286090',
          '#F7464A',
          '#46BFBD',
          '#FDB45C',
          '#97BBCD',
          '#4D5360',
          '#8c4f9f'
        ];

        this.chart = {
          series: [],
          labels: [],
          data: []
        }

        Chart.defaults.global.colours = this.chartColors;

        this.chartType = 'line';

        if($stateParams.name && $stateParams.tenant){
          this.name = $stateParams.name;
          this.tenant = $stateParams.tenant;
          // TODO rename tenant in resource_id
        }
        else{
          throw new Error('Missing Name and Tenant Params!');
        }

        /**
         * Goes trough the array and format date to be used as labels
         *
         * @param Array data
         * @returns Array a list of labels
         */

        this.getLabels = (data) => {
          return data.reduce((list, item) => {
            let date = new Date(item.timestamp);
            list.push(`${date.getHours()}:${(date.getMinutes()<10?'0':'') + date.getMinutes()}:${date.getSeconds()}`);
            return list;
          }, []);
        };

        /**
         * Goes trough the array and return a flat array of values
         *
         * @param Array data
         * @returns Array a list of values
         */

        this.getData = (data) => {
          return data.reduce((list, item) => {
            list.push(item.volume);
            return list;
          }, []);
        }

        /**
         * Add a samples to the chart
         *
         * @param string resource_id
         */
        this.chartMeters = [];
        this.addMeterToChart = (resource_id) => {
          this.chart['labels'] = this.getLabels(lodash.sortBy(this.samplesList[resource_id], 'timestamp'));
          this.chart['series'].push(resource_id);
          this.chart['data'].push(this.getData(lodash.sortBy(this.samplesList[resource_id], 'timestamp')));
          this.chartMeters.push(this.samplesList[resource_id][0]); //use the 0 as are all samples for the same resource and I need the name
          lodash.remove(this.sampleLabels, {id: resource_id});
        }

        this.removeFromChart = (meter) => {
          this.chart.data.splice(this.chart.series.indexOf(meter.resource_id), 1);
          this.chart.series.splice(this.chart.series.indexOf(meter.resource_id), 1);
          this.chartMeters.splice(lodash.findIndex(this.chartMeters, {resource_id: meter.resource_id}), 1);
          this.sampleLabels.push({
            id: meter.resource_id,
            name: meter.resource_name || meter.resource_id
          })
        };

        /**
         * Format samples to create a list of labels and ids
         */

        this.formatSamplesLabels = (samples) => {

          return lodash.uniq(samples, 'resource_id')
            .reduce((labels, item) => {
              labels.push({
                id: item.resource_id,
                name: item.resource_name || item.resource_id
              });

              return labels;
            }, []);
        }


        /**
         * Load the samples and format data
         */

        this.showSamples = () => {
          this.loader = true;
          // Ceilometer.getSamples(this.name, this.tenant) //fetch one
          Ceilometer.getSamples(this.name) //fetch all
            .then(res => {

              // rename things in UI
              res.map(m => {
                m.resource_name = m.resource_name.replace('mysite_onos_vbng', 'ONOS_FABRIC');
                m.resource_name = m.resource_name.replace('mysite_onos_volt', 'ONOS_CORD');
                m.resource_name = m.resource_name.replace('mysite_vbng', 'mysite_vRouter');
                return m;
              });
              // end rename things in UI

              // setup data for visualization
              this.samplesList = lodash.groupBy(res, 'resource_id');
              this.sampleLabels = this.formatSamplesLabels(res);

              // add current meter to chart
              this.addMeterToChart(this.tenant);

            })
            .catch(err => {
              this.error = err.data.detail;
            })
            .finally(() => {
              this.loader = false;
            });
        };

        this.showSamples();
      }
    }
  });
})();

