///<reference path="../../../headers/common.d.ts" />

import _ from 'lodash';

export const metricAggTypes = [
  {text: "Count",   value: 'count', requiresField: false},
  {text: "Average",  value: 'avg', requiresField: true, supportsInlineScript: true, supportsMissing: true},
  {text: "Sum",  value: 'sum', requiresField: true, supportsInlineScript: true, supportsMissing: true},
  {text: "Max",  value: 'max', requiresField: true, supportsInlineScript: true, supportsMissing: true},
  {text: "Min",  value: 'min', requiresField: true, supportsInlineScript: true, supportsMissing: true},
  {text: "Extended Stats",  value: 'extended_stats', requiresField: true, supportsMissing: true, supportsInlineScript: true},
  {text: "Percentiles",  value: 'percentiles', requiresField: true, supportsMissing: true, supportsInlineScript: true},
  {text: "Unique Count", value: "cardinality", requiresField: true, supportsMissing: true},
  {text: "Moving Average",  value: 'moving_avg', requiresField: false, isPipelineAgg: true, minVersion: 2},
  {text: "Derivative",  value: 'derivative', requiresField: false, isPipelineAgg: true, minVersion: 2 },
  {text: "Raw Document", value: "raw_document", requiresField: false}
];

export const bucketAggTypes = [
  {text: "Terms",           value: 'terms', requiresField: true},
  {text: "Filters",         value: 'filters' },
  {text: "Geo Hash Grid",   value: 'geohash_grid', requiresField: true},
  {text: "Date Histogram",  value: 'date_histogram', requiresField: true},
  {text: "Histogram",       value: 'histogram', requiresField: true},
];

export const orderByOptions = [
  {text: "Doc Count",  value: '_count' },
  {text: "Term value", value: '_term' },
];

export const orderOptions = [
  {text: "Top",     value: 'desc' },
  {text: "Bottom",  value: 'asc' },
];

export const sizeOptions = [
  {text: "No limit", value: '0' },
  {text: "1", value: '1' },
  {text: "2", value: '2' },
  {text: "3", value: '3' },
  {text: "5", value: '5' },
  {text: "10", value: '10' },
  {text: "15", value: '15' },
  {text: "20", value: '20' },
];

export const extendedStats = [
  {text: 'Avg', value: 'avg'},
  {text: 'Min', value: 'min'},
  {text: 'Max', value: 'max'},
  {text: 'Sum', value: 'sum'},
  {text: 'Count', value: 'count'},
  {text: 'Std Dev', value: 'std_deviation'},
  {text: 'Std Dev Upper', value: 'std_deviation_bounds_upper'},
  {text: 'Std Dev Lower', value: 'std_deviation_bounds_lower'},
];

export const intervalOptions = [
  {text: 'auto', value: 'auto'},
  {text: '10s', value: '10s'},
  {text: '1m', value: '1m'},
  {text: '5m', value: '5m'},
  {text: '10m', value: '10m'},
  {text: '20m', value: '20m'},
  {text: '1h', value: '1h'},
  {text: '1d', value: '1d'},
];

export const movingAvgModelOptions = [
  {text: 'Simple', value: 'simple'},
  {text: 'Linear', value: 'linear'},
  {text: 'Exponentially Weighted', value: 'ewma'},
  {text: 'Holt Linear', value: 'holt'},
  {text: 'Holt Winters', value: 'holt_winters'},
];

export const pipelineOptions = {
  'moving_avg' : [
    {text: 'window', default: 5},
    {text: 'model', default: 'simple'},
    {text: 'predict', default: undefined},
    {text: 'minimize', default: false},
  ],
  'derivative': [
    {text: 'unit', default: undefined},
  ]
};

export const movingAvgModelSettings = {
  'simple' : [],
  'linear' : [],
  'ewma' : [
    {text: "Alpha", value: "alpha", default: undefined}],
  'holt' : [
    {text: "Alpha", value: "alpha",  default: undefined},
    {text: "Beta", value: "beta",  default: undefined},
    ],
  'holt_winters' : [
    {text: "Alpha", value: "alpha", default: undefined},
    {text: "Beta", value: "beta", default: undefined},
    {text: "Gamma", value: "gamma", default: undefined},
    {text: "Period", value: "period", default: undefined},
    {text: "Pad", value: "pad", default: undefined, isCheckbox: true},
    ],
};

export function getMetricAggTypes(esVersion) {
  return _.filter(metricAggTypes, function(f) {
    if (f.minVersion) {
      return f.minVersion <= esVersion;
    } else {
      return true;
    }
  });
}

export function getPipelineOptions(metric) {
  if (!isPipelineAgg(metric.type)) {
    return [];
  }

  return pipelineOptions[metric.type];
}

export function isPipelineAgg(metricType) {
  if (metricType) {
    var po = pipelineOptions[metricType];
    return po !== null && po !== undefined;
  }

  return false;
}

export function getPipelineAggOptions(targets) {
  var result = [];
  _.each(targets.metrics, function(metric) {
    if (!isPipelineAgg(metric.type)) {
      result.push({text: describeMetric(metric), value: metric.id });
    }
  });

  return result;
}

export function getMovingAvgSettings(model, filtered) {
  var filteredResult = [];
  if (filtered) {
    _.each(movingAvgModelSettings[model], function(setting) {
      if (!(setting.isCheckbox)) {
        filteredResult.push(setting);
      }
    });
    return filteredResult;
  }
  return movingAvgModelSettings[model];
}

export function getOrderByOptions(target) {
  var metricRefs = [];
  _.each(target.metrics, function(metric) {
    if (metric.type !== 'count') {
      metricRefs.push({text: describeMetric(metric), value: metric.id});
    }
  });

  return orderByOptions.concat(metricRefs);
}

export function describeOrder(order) {
  var def = _.find(orderOptions, {value: order});
  return def.text;
}

export function describeMetric(metric) {
  var def = _.find(metricAggTypes, {value: metric.type});
  return def.text + ' ' + metric.field;
}

export function describeOrderBy(orderBy, target) {
  var def = _.find(orderByOptions, {value: orderBy});
  if (def) {
    return def.text;
  }
  var metric = _.find(target.metrics, {id: orderBy});
  if (metric) {
    return describeMetric(metric);
  } else {
    return "metric not found";
  }
}
