/*

## Stats Module

### Parameters
* format :: The format of the value returned. (Default: number)
* style :: The font size of the main number to be displayed.
* mode :: The aggergate value to use for display
* spyable ::  Dislay the 'eye' icon that show the last elasticsearch query

*/ define([

'angular',
'app',
'lodash',
'jquery',
'kbn',
'numeral'

], function (

angular,
app,
_,
$,
kbn,
numeral

) {

'use strict';

var module = angular.module('kibana.panels.stats', []);
app.useModule(module);

module.controller('stats', function ($scope, querySrv, dashboard, filterSrv) {

  $scope.panelMeta = {
    modals : [
      {
        description: "Inspect",
        icon: "icon-info-sign",
        partial: "app/partials/inspector.html",
        show: $scope.panel.spyable
      }
    ],
    editorTabs : [
      {title:'Queries', src:'app/partials/querySelect.html'}
    ],
    status: 'Beta',
    description: 'A statistical panel for displaying aggregations using the Elastic Search statistical facet query.'
  };

  $scope.modes = ['count','min','max','mean','total','variance','std_deviation','sum_of_squares'];

  var defaults = {
    queries     : {
      mode        : 'all',
      ids         : []
    },
    style   : { "font-size": '24pt'},
    format: 'number',
    mode: 'count',
    display_breakdown: 'yes',
    sort_field: '',
    sort_reverse: false,
    label_name: 'Query',
    value_name: 'Value',
    spyable     : true,
    show: {
      count: true,
      min: true,
      max: true,
      mean: true,
      std_deviation: true,
      sum_of_squares: true,
      total: true,
      variance: true
    }
  };

  _.defaults($scope.panel, defaults);

  $scope.init = function () {
    $scope.ready = false;
    $scope.$on('refresh', function () {
      $scope.get_data();
    });
    $scope.get_data();
  };

  $scope.set_sort = function(field) {
    console.log(field);
    if($scope.panel.sort_field === field && $scope.panel.sort_reverse === false) {
      $scope.panel.sort_reverse = true;
    } else if($scope.panel.sort_field === field && $scope.panel.sort_reverse === true) {
      $scope.panel.sort_field = '';
      $scope.panel.sort_reverse = false;
    } else {
      $scope.panel.sort_field = field;
      $scope.panel.sort_reverse = false;
    }
  };

  $scope.get_data = function () {
    if(dashboard.indices.length === 0) {
      return;
    }

    $scope.panelMeta.loading = true;

    var request,
      results,
      boolQuery,
      queries;

    request = $scope.ejs.Request().indices(dashboard.indices);

    $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
    queries = querySrv.getQueryObjs($scope.panel.queries.ids);

    // This could probably be changed to a BoolFilter
    boolQuery = $scope.ejs.BoolQuery();
    _.each(queries,function(q) {
      boolQuery = boolQuery.should(querySrv.toEjsObj(q));
    });

    request = request
      .facet($scope.ejs.StatisticalFacet('stats')
        .field($scope.panel.field)
        .facetFilter($scope.ejs.QueryFilter(
          $scope.ejs.FilteredQuery(
            boolQuery,
            filterSrv.getBoolFilter(filterSrv.ids())
            )))).size(0);

    _.each(queries, function (q) {
      var alias = q.alias || q.query;
      var query = $scope.ejs.BoolQuery();
      query.should(querySrv.toEjsObj(q));
      request.facet($scope.ejs.StatisticalFacet('stats_'+alias)
        .field($scope.panel.field)
        .facetFilter($scope.ejs.QueryFilter(
          $scope.ejs.FilteredQuery(
            query,
            filterSrv.getBoolFilter(filterSrv.ids())
          )
        ))
      );
    });

    // Populate the inspector panel
    $scope.inspector = angular.toJson(JSON.parse(request.toString()),true);

    results = request.doSearch();

    results.then(function(results) {
      $scope.panelMeta.loading = false;
      var value = results.facets.stats[$scope.panel.mode];

      var rows = queries.map(function (q) {
        var alias = q.alias || q.query;
        var obj = _.clone(q);
        obj.label = alias;
        obj.Label = alias.toLowerCase(); //sort field
        obj.value = results.facets['stats_'+alias];
        obj.Value = results.facets['stats_'+alias]; //sort field
        return obj;
      });

      $scope.data = {
        value: value,
        rows: rows
      };

      console.log($scope.data);

      $scope.$emit('render');
    });
  };

  $scope.set_refresh = function (state) {
    $scope.refresh = state;
  };

  $scope.close_edit = function() {
    if($scope.refresh) {
      $scope.get_data();
    }
    $scope.refresh =  false;
    $scope.$emit('render');
  };

});

module.filter('formatstats', function(){
  return function (value,format) {
    switch (format) {
    case 'money':
      value = numeral(value).format('$0,0.00');
      break;
    case 'bytes':
      value = numeral(value).format('0.00b');
      break;
    case 'float':
      value = numeral(value).format('0.000');
      break;
    default:
      value = numeral(value).format('0,0');
    }
    return value;
  };
});

});