/**
 * 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.
 */
define([
    'angular',
    'lodash',
    'jquery',
    //'./directives',
    './query_ctrl'
  ],
  function (angular, _) {
    'use strict';


    /**
     * AMS Datasource Constructor
     */
    function AmbariMetricsDatasource(instanceSettings, $q, backendSrv, templateSrv) {
      this.type = 'ambari-metrics';
      this.name = instanceSettings.name;
      this.url = instanceSettings.url;
      this.withCredentials = instanceSettings.withCredentials;
      this.basicAuth = instanceSettings.basicAuth;

      var allMetrics = {};
      var appIds = [];

      /**
       * AMS Datasource  Authentication
       */
      this.doAmbariRequest = function (options) {
        if (this.basicAuth || this.withCredentials) {
          options.withCredentials = true;
        }
        if (this.basicAuth) {
          options.headers = options.headers || {};
          options.headers.Authorization = this.basicAuth;
        }

        options.url = this.url + options.url;
        options.inspect = {type: 'ambarimetrics'};

        return backendSrv.datasourceRequest(options);
      };

      //We get a list of components and their associated metrics.
      this.initMetricAppidMapping = function () {
        return this.doAmbariRequest({url: '/ws/v1/timeline/metrics/metadata'})
          .then(function (items) {
            items = items.data;
            allMetrics = {};
            appIds = [];
            _.forEach(items, function (metric, app) {
              metric.forEach(function (component) {
                if (!allMetrics[app]) {
                  allMetrics[app] = [];
                }
                allMetrics[app].push(component.metricname);
              });
            });
            //We remove a couple of components from the list that do not contain any
            //pertinent metrics.
            delete allMetrics["timeline_metric_store_watcher"];
            delete allMetrics["amssmoketestfake"];
            appIds = Object.keys(allMetrics);
          });
      };
      this.initMetricAppidMapping();



      /**
       * AMS Datasource  Query
       */
      this.query = function (options) {
        var emptyData = function (metric) {
          var legend = metric.alias ? metric.alias : metric.metric;
          return {
            data: {
              target: legend,
              datapoints: []
            }
          };
        };
        var self = this;
        var getMetricsData = function (target) {
          var alias = target.alias ? target.alias : target.metric;
          if (!_.isEmpty(templateSrv.variables) && templateSrv.variables[0].query === "yarnqueues") {
            alias = alias + ' on ' + target.qmetric;
          }
          if (!_.isEmpty(templateSrv.variables) && templateSrv.variables[0].query === "kafka-topics") {
            alias = alias + ' on ' + target.kbTopic;
          }
          return function (res) {
            res = res.data;
            console.log('processing metric ' + target.metric);
            if (!res.metrics[0] || target.hide) {
              return $q.when(emptyData(target));
            }
            var series = [];
            var metricData = res.metrics[0].metrics;
            // Added hostname to legend for templated dashboards.
            var hostLegend = res.metrics[0].hostname ? ' on ' + res.metrics[0].hostname : '';
            var timeSeries = {};
            timeSeries = {
              target: alias + hostLegend,
              datapoints: []
            };
            for (var k in metricData) {
              if (metricData.hasOwnProperty(k)) {
                timeSeries.datapoints.push([metricData[k], (k - k % 1000)]);
              }
            }
            series.push(timeSeries);
            return $q.when({data: series});
          };
        };
        // To speed up querying on templatized dashboards.
        var allHostMetricsData = function (target) {
          var alias = target.alias ? target.alias : target.metric;
          if (!_.isEmpty(templateSrv.variables) && templateSrv.variables[0].query === "hbase-users") {
            alias = alias + ' for ' + target.hbUser;
          }
          // Aliases for Storm Topologies and components under a topology.
          if (!_.isEmpty(templateSrv.variables) && templateSrv.variables[0].query === "topologies" &&
            !templateSrv.variables[1]) {
            alias = alias + ' on ' + target.sTopology;
          }
          if (!_.isEmpty(templateSrv.variables[1]) && templateSrv.variables[1].name === "component") {
            alias = alias + ' on ' + target.sTopology + ' for ' + target.sComponent;
          }

          // Aliases for Druid Datasources.
          if (!_.isEmpty(templateSrv.variables) && templateSrv.variables[0].query === "druidDataSources" &&
            !templateSrv.variables[1]) {
            alias = alias.replace('$druidDataSource', target.sDataSource);
          }
          return function (res) {
            res = res.data;
            console.log('processing metric ' + target.metric);
            if (!res.metrics[0] || target.hide) {
              return $q.when(emptyData(target));
            }
            var series = [];
            var timeSeries = {};
            var metricData = res.metrics;
            _.map(metricData, function (data) {
              var totalCountFlag = false;
              var aliasSuffix = data.hostname ? ' on ' + data.hostname : '';
              var op = '';
              var user = '';
              if (!_.isEmpty(templateSrv.variables) && templateSrv.variables[0].query === "hbase-tables") {
                var tableName = "Tables.";
                var tableSuffix = data.metricname.substring(data.metricname.indexOf(tableName) + tableName.length,
                  data.metricname.lastIndexOf("_metric"));
                aliasSuffix = ' on ' + tableSuffix;
              }
              if (templateSrv.variables[0].query === "callers") {
                alias = data.metricname.substring(data.metricname.indexOf('(') + 1, data.metricname.indexOf(')'));
              }
              // Set legend and alias for HDFS - TopN dashboard
              if (data.metricname.indexOf('dfs.NNTopUserOpCounts') === 0) {
                var metricname_arr = data.metricname.split(".");
                _.map(metricname_arr, function (segment) {
                  if (segment.indexOf('op=') === 0) {
                    var opKey = 'op=';
                    op = segment.substring(segment.indexOf(opKey) + opKey.length);
                  } else if (segment.indexOf('user=') === 0) {
                    var userKey = 'user=';
                    user = segment.substring(segment.indexOf(userKey) + userKey.length);
                  }
                });
                // Check if metric is TotalCount
                if (data.metricname.indexOf('TotalCount') > 0) {
                  totalCountFlag = true;
                  if (op !== '*') {
                    alias = op;
                  } else {
                    alias = 'Total Count';
                  }
                } else if (op !== '*') {
                  alias = op + ' by ' + user;
                } else {
                  alias = user;
                }
                aliasSuffix = '';
              }
              if (data.appid.indexOf('ambari_server') === 0) {
                alias = data.metricname;
                aliasSuffix = '';
              }
              timeSeries = {
                target: alias + aliasSuffix,
                datapoints: []
              };
              for (var k in data.metrics) {
                if (data.metrics.hasOwnProperty(k)) {
                  timeSeries.datapoints.push([data.metrics[k], (k - k % 1000)]);
                }
              }
              if ((user !== '*') || (totalCountFlag)) {
                series.push(timeSeries);
              }
            });
            return $q.when({data: series});
          };
        };
        var getHostAppIdData = function (target) {
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var instanceId = typeof target.cluster == 'undefined' ? '' : '&instanceId=' + target.cluster;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.metric + metricTransform +
            metricAggregator + "&hostname=" + target.hosts + '&appId=' + target.app + instanceId + '&startTime=' + from +
            '&endTime=' + to + precision + seriesAggregator
          }).then(
            getMetricsData(target)
          );
        };
        //Check if it's a templated dashboard.
        var templatedClusters = templateSrv.variables.filter(function (o) {
          return o.name === "cluster"
        });
        var templatedCluster = (_.isEmpty(templatedClusters)) ? '' : templatedClusters[0].options.filter(function (cluster) {
          return cluster.selected;
        }).map(function (clusterName) {
          return clusterName.value;
        });

        var templatedHosts = templateSrv.variables.filter(function (o) {
          return o.name === "hosts"
        });
        var templatedHost = (_.isEmpty(templatedHosts)) ? '' : templatedHosts[0].options.filter(function (host) {
          return host.selected;
        }).map(function (hostName) {
          return hostName.value;
        });

        var tComponents = _.isEmpty(templateSrv.variables) ? '' : templateSrv.variables.filter(function (variable) {
          return variable.name === "components"
        });
        var tComponent = _.isEmpty(tComponents) ? '' : tComponents[0].current.value;

        var getServiceAppIdData = function (target) {
          var tCluster = (_.isEmpty(templateSrv.variables)) ? templatedCluster : '';
          var instanceId = typeof tCluster == 'undefined' ? '' : '&instanceId=' + tCluster;
          var tHost = (_.isEmpty(templateSrv.variables)) ? templatedHost : target.templatedHost;
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.metric + metricTransform
            + metricAggregator + '&hostname=' + tHost + '&appId=' + target.app + instanceId + '&startTime=' + from +
            '&endTime=' + to + precision + seriesAggregator
          }).then(
            getMetricsData(target)
          );
        };
        // To speed up querying on templatized dashboards.
        var getAllHostData = function (target) {
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var topN = "";
          var isBottomN = "";
          if (!_.isEmpty(templateSrv.variables.filter(function (o) {
            return o.name === "instances";
          }))) {
            var metricTopN = _.filter(templateSrv.variables, function (o) {
              return o.name === "instances";
            });
            var metricTopAgg = _.filter(templateSrv.variables, function (o) {
              return o.name === "topagg";
            });
            isBottomN = templateSrv.variables.filter(function (o) {
              return o.name === "orientation";
            })[0].current.value
            === "bottom" ? true : false;
            topN = '&topN=' + metricTopN[0].current.value + '&topNFunction=' + metricTopAgg[0].current.value + '&isBottomN=' + isBottomN;
          }
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          var templatedComponent = (_.isEmpty(tComponent)) ? target.app : tComponent;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.metric + metricTransform
            + metricAggregator + '&hostname=' + target.templatedHost + '&appId=' + templatedComponent + instanceId
            + '&startTime=' + from + '&endTime=' + to + precision + topN + seriesAggregator
          }).then(
            allHostMetricsData(target)
          );
        };
        var getYarnAppIdData = function (target) {
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + encodeURIComponent(target.queue) + metricTransform
            + metricAggregator + '&appId=resourcemanager' + instanceId + '&startTime=' + from +
            '&endTime=' + to + precision + seriesAggregator
          }).then(
            getMetricsData(target)
          );
        };
        var getHbaseAppIdData = function (target) {
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.hbMetric + instanceId + '&appId=hbase&startTime='
            + from + '&endTime=' + to + precision + seriesAggregator
          }).then(
            allHostMetricsData(target)
          );
        };

        var getKafkaAppIdData = function (target) {
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.kbMetric + metricTransform + instanceId
            + metricAggregator + '&appId=kafka_broker&startTime=' + from +
            '&endTime=' + to + precision + seriesAggregator
          }).then(
            getMetricsData(target)
          );
        };
        var getNnAppIdData = function (target) {

          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.nnMetric + metricTransform + instanceId
            + metricAggregator + '&appId=namenode&startTime=' + from + '&endTime=' + to + precision + seriesAggregator
          }).then(
            allHostMetricsData(target)
          );
        };

        // Storm Topology calls.
        var getStormData = function (target) {
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.sTopoMetric + metricTransform + instanceId
            + metricAggregator + '&appId=nimbus&startTime=' + from + '&endTime=' + to + precision + seriesAggregator
          }).then(
            allHostMetricsData(target)
          );
        };

        // Infra Solr Calls
        var getSolrCoreData = function (target) {
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.sCoreMetric + metricTransform + instanceId
            + metricAggregator + '&appId=ambari-infra-solr&startTime=' + from + '&endTime=' + to + precision + seriesAggregator
          }).then(
            allHostMetricsData(target)
          );
        };

        var getSolrCollectionData = function (target) {
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.sCollectionMetric + metricTransform + instanceId
            + metricAggregator + '&appId=ambari-infra-solr&startTime=' + from + '&endTime=' + to + precision + seriesAggregator
          }).then(
            allHostMetricsData(target)
          );
        };

        // Druid calls.
        var getDruidData = function (target) {
          var instanceId = typeof target.templatedCluster == 'undefined' ? '' : '&instanceId=' + target.templatedCluster;
          var precision = target.precision === 'default' || typeof target.precision == 'undefined' ? '' : '&precision='
            + target.precision;
          var metricAggregator = target.aggregator === "none" ? '' : '._' + target.aggregator;
          var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
          var seriesAggregator = !target.seriesAggregator || target.seriesAggregator === "none" ? '' : '&seriesAggregateFunction=' + target.seriesAggregator;
          return self.doAmbariRequest({
            url: '/ws/v1/timeline/metrics?metricNames=' + target.sDataSourceMetric + metricTransform + instanceId
            + metricAggregator + '&appId=druid&startTime=' + from + '&endTime=' + to + precision + seriesAggregator
          }).then(
            allHostMetricsData(target)
          );
        };

        // Time Ranges
        var from = Math.floor(options.range.from.valueOf() / 1000);
        var to = Math.floor(options.range.to.valueOf() / 1000);

        var metricsPromises = [];
        if (!_.isEmpty(templateSrv.variables)) {
          // YARN Queues Dashboard
          if (templateSrv.variables[0].query === "yarnqueues") {
            var allQueues = templateSrv.variables.filter(function (variable) {
              return variable.query === "yarnqueues";
            });
            var selectedQs = (_.isEmpty(allQueues)) ? "" : allQueues[0].options.filter(function (q) {
              return q.selected;
            }).map(function (qName) {
              return qName.value;
            });
            // All Queues
            if (!_.isEmpty(_.find(selectedQs, function (wildcard) {
              return wildcard === "*";
            }))) {
              var allQueue = allQueues[0].options.filter(function (q) {
                return q.text !== "All";
              }).map(function (queue) {
                return queue.value;
              });
              _.forEach(allQueue, function (processQueue) {
                metricsPromises.push(_.map(options.targets, function (target) {
                  target.qmetric = processQueue;
                  target.queue = target.metric.replace('root', target.qmetric);
                  return getYarnAppIdData(target);
                }));
              });
            } else {
              // All selected queues.
              _.forEach(selectedQs, function (processQueue) {
                metricsPromises.push(_.map(options.targets, function (target) {
                  target.qmetric = processQueue;
                  target.queue = target.metric.replace('root', target.qmetric);
                  return getYarnAppIdData(target);
                }));
              });
            }
          }
          // Templatized Dashboard for per-user metrics in HBase.
          if (templateSrv.variables[0].query === "hbase-users") {
            var allUsers = templateSrv.variables.filter(function (variable) {
              return variable.query === "hbase-users";
            });
            var selectedUsers = (_.isEmpty(allUsers)) ? "" : allUsers[0].options.filter(function (user) {
              return user.selected;
            }).map(function (uName) {
              return uName.value;
            });
            selectedUsers = templateSrv._values.Users.lastIndexOf('}') > 0 ? templateSrv._values.Users.slice(1, -1) :
              templateSrv._values.Users;
            var selectedUser = selectedUsers.split(',');
            _.forEach(selectedUser, function (processUser) {
              metricsPromises.push(_.map(options.targets, function (target) {
                target.hbUser = processUser;
                var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
                target.hbMetric = target.metric.replace('*', target.hbUser) + metricTransform + '._' + target.aggregator;
                return getHbaseAppIdData(target);
              }));
            });
          }
          // Templatized Dashboard for per-table metrics in HBase.
          if (templateSrv.variables[0].query === "hbase-tables") {
            var splitTables = [];
            var allTables = templateSrv._values.Tables.lastIndexOf('}') > 0 ? templateSrv._values.Tables.slice(1, -1) :
              templateSrv._values.Tables;
            var allTable = allTables.split(',');
            while (allTable.length > 0) {
              splitTables.push(allTable.splice(0, 20));
            }
            _.forEach(splitTables, function (table) {
              metricsPromises.push(_.map(options.targets, function (target) {
                var hbMetric = [];
                _.map(table, function (tableMetric) {
                  hbMetric.push(target.metric.replace('*', tableMetric));
                });
                var metricTransform = !target.transform || target.transform === "none" ? '' : '._' + target.transform;
                hbMetric = _.map(hbMetric, function (tbl) {
                  return tbl + metricTransform + '._' + target.aggregator;
                });
                target.hbMetric = _.flatten(hbMetric).join(',');
                return getHbaseAppIdData(target);
              }));
            });
          }
          // Templatized Dashboard for per-topic metrics in Kafka.
          if (templateSrv.variables[0].query === "kafka-topics") {
            var allTopics = templateSrv.variables.filter(function (variable) {
              return variable.query === "kafka-topics";
            });
            var selectedTopics = (_.isEmpty(allTopics)) ? "" : allTopics[0].options.filter(function (topic) {
              return topic.selected;
            }).map(function (topicName) {
              return topicName.value;
            });
            selectedTopics = templateSrv._values.Topics.lastIndexOf('}') > 0 ? templateSrv._values.Topics.slice(1, -1) :
              templateSrv._values.Topics;
            var selectedTopic = selectedTopics.split(',');
            _.forEach(selectedTopic, function (processTopic) {
              metricsPromises.push(_.map(options.targets, function (target) {
                target.kbTopic = processTopic;
                target.kbMetric = target.metric.replace('*', target.kbTopic);
                return getKafkaAppIdData(target);
              }));
            });
          }
          //Templatized Dashboard for Call Queues
          if (templateSrv.variables[0].query === "callers") {
            var allCallers = templateSrv.variables.filter(function (variable) {
              return variable.query === "callers";
            });
            var selectedCallers = (_.isEmpty(allCallers)) ? "" : allCallers[0].options.filter(function (user) {
              return user.selected;
            }).map(function (callerName) {
              return callerName.value;
            });
            selectedCallers = templateSrv._values.Callers.lastIndexOf('}') > 0 ? templateSrv._values.Callers.slice(1, -1) :
              templateSrv._values.Callers;
            var selectedCaller = selectedCallers.split(',');
            _.forEach(selectedCaller, function (processCaller) {
              metricsPromises.push(_.map(options.targets, function (target) {
                target.nnCaller = processCaller;
                target.nnMetric = target.metric.replace('*', target.nnCaller);
                return getNnAppIdData(target);
              }));
            });
          }

          //Templatized Dashboard for Infra Solr Cores
          if (templateSrv.variables[0].query === "infra_solr_core") {
            var allCores = templateSrv.variables.filter(function (variable) {
              return variable.query === "infra_solr_core";
            });
            var selectedCores = (_.isEmpty(allCores)) ? "" : allCores[0].options.filter(function (core) {
              return core.selected;
            }).map(function (coreName) {
              return coreName.value;
            });
            selectedCores = templateSrv._values.Cores.lastIndexOf('}') > 0 ? templateSrv._values.Cores.slice(1, -1) :
              templateSrv._values.Cores;
            var selectedCore = selectedCores.split(',');
            _.forEach(selectedCore, function (processCore) {
              metricsPromises.push(_.map(options.targets, function (target) {
                target.sCore = processCore;
                target.sCoreMetric = target.metric.replace('*', target.sCore);
                return getSolrCoreData(target);
              }));
            });
          }

          //Templatized Dashboard for Infra Solr Collections
          if (templateSrv.variables[0].query === "infra_solr_collection") {
            var allCollections = templateSrv.variables.filter(function (variable) {
              return variable.query === "infra_solr_collection";
            });
            var selectedCollections = (_.isEmpty(allCollections)) ? "" : allCollections[0].options.filter(function (collection) {
              return collection.selected;
            }).map(function (collectionsName) {
              return collectionsName.value;
            });
            selectedCollections = templateSrv._values.Collections.lastIndexOf('}') > 0 ? templateSrv._values.Collections.slice(1, -1) :
              templateSrv._values.Collections;
            var selectedCollection = selectedCollections.split(',');
            _.forEach(selectedCollection, function (processCollection) {
              metricsPromises.push(_.map(options.targets, function (target) {
                target.sCollection = processCollection;
                target.sCollectionMetric = target.metric.replace('*', target.sCollection);
                return getSolrCollectionData(target);
              }));
            });
          }

          //Templatized Dashboard for Storm Topologies
          if (templateSrv.variables[0].query === "topologies" && !templateSrv.variables[1]) {
            var allTopologies = templateSrv.variables.filter(function (variable) {
              return variable.query === "topologies";
            });
            var selectedTopologies = (_.isEmpty(allTopologies)) ? "" : allTopologies[0].options.filter(function (topo) {
              return topo.selected;
            }).map(function (topoName) {
              return topoName.value;
            });
            selectedTopologies = templateSrv._values.topologies.lastIndexOf('}') > 0 ? templateSrv._values.topologies.slice(1, -1) :
              templateSrv._values.topologies;
            var selectedTopology = selectedTopologies.split(',');
            _.forEach(selectedTopology, function (processTopology) {
              metricsPromises.push(_.map(options.targets, function (target) {
                target.sTopology = processTopology;
                target.sTopoMetric = target.metric.replace('*', target.sTopology);
                return getStormData(target);
              }));
            });
          }

          //Templatized Dashboards for Storm Components
          if (templateSrv.variables[0].query === "topologies" && templateSrv.variables[1] &&
            templateSrv.variables[1].name === "component") {
            var selectedTopology = templateSrv._values.topologies;
            var selectedComponent = templateSrv._values.component;
            metricsPromises.push(_.map(options.targets, function (target) {
              target.sTopology = selectedTopology;
              target.sComponent = selectedComponent;
              target.sTopoMetric = target.metric.replace('*', target.sTopology).replace('*', target.sComponent);
              return getStormData(target);
            }));
          }

          //Templatized Dashboard for Storm Kafka Offset
          if (templateSrv.variables[0].query === "topologies" && templateSrv.variables[1] &&
            templateSrv.variables[1].name === "topic") {
            var selectedTopology = templateSrv._values.topologies;
            var selectedTopic = templateSrv._values.topic;
            metricsPromises.push(_.map(options.targets, function (target) {
              target.sTopology = selectedTopology;
              target.sTopic = selectedTopic;
              target.sPartition = options.scopedVars.partition.value;
              target.sTopoMetric = target.metric.replace('*', target.sTopology).replace('*', target.sTopic)
                .replace('*', target.sPartition);
              return getStormData(target);
            }));
          }

          //Templatized Dashboards for Druid
          if (templateSrv.variables[0].query === "druidDataSources" && !templateSrv.variables[1]) {
            var allDataSources = templateSrv.variables.filter(function (variable) {
              return variable.query === "druidDataSources";
            });
            var selectedDataSources = (_.isEmpty(allDataSources)) ? "" : allDataSources[0].options.filter(function (dataSource) {
              return dataSource.selected;
            }).map(function (dataSourceName) {
              return dataSourceName.value;
            });
            selectedDataSources = templateSrv._values.druidDataSources.lastIndexOf('}') > 0 ? templateSrv._values.druidDataSources.slice(1, -1) :
              templateSrv._values.druidDataSources;
            var selectedDataSource = selectedDataSources.split(',');
            _.forEach(selectedDataSource, function (processDataSource) {
              metricsPromises.push(_.map(options.targets, function (target) {
                target.sDataSource = processDataSource;
                target.sDataSourceMetric = target.metric.replace('*', target.sDataSource);
                return getDruidData(target);
              }));
            });
          }
          // To speed up querying on templatized dashboards.
          var indexOfHosts = -1;
          for (var i = 0; i < templateSrv.variables.length; i++) {
            if (templateSrv.variables[i].name == 'hosts') {
              indexOfHosts = i;
            }
          }
          if (indexOfHosts >= 0) {
            var allHosts = templateSrv._values.hosts.lastIndexOf('}') > 0 ? templateSrv._values.hosts.slice(1, -1) :
              templateSrv._values.hosts;
            allHosts = templateSrv._texts.hosts === "All" ? '%' : allHosts;
            metricsPromises.push(_.map(options.targets, function (target) {
              target.templatedHost = allHosts ? allHosts : '';
              target.templatedCluster = templatedCluster;
              return getAllHostData(target);
            }));
          }
          metricsPromises = _.flatten(metricsPromises);
        } else {
          // Non Templatized Dashboards
          metricsPromises = _.map(options.targets, function (target) {
            console.debug('target app=' + target.app + ',' +
              'target metric=' + target.metric + ' on host=' + target.tempHost);
            if (!!target.hosts) {
              return getHostAppIdData(target);
            } else {
              return getServiceAppIdData(target);
            }
          });
        }

        return $q.all(metricsPromises).then(function (metricsDataArray) {
          var data = _.map(metricsDataArray, function (metricsData) {
            return metricsData.data;
          });
          var metricsDataResult = {data: _.flatten(data)};
          return $q.when(metricsDataResult);
        });
      };

      /**
       * AMS Datasource  List Series.
       */
      this.listSeries = function (query) {
        // wrap in regex
        if (query && query.length > 0 && query[0] !== '/') {
          query = '/' + query + '/';
        }
        return $q.when([]);
      };

      /**
       * AMS Datasource Templating Variables.
       */
      this.metricFindQuery = function (query) {
        var interpolated;
        try {
          interpolated = query.split('.')[0];
        } catch (err) {
          return $q.reject(err);
        }
        var templatedClusters = templateSrv.variables.filter(function (o) {
          return o.name === "cluster"
        });
        var templatedCluster = (_.isEmpty(templatedClusters)) ? '' : templatedClusters[0].options.filter(function (cluster) {
          return cluster.selected;
        }).map(function (clusterName) {
          return clusterName.value;
        });

        var tComponents = _.isEmpty(templateSrv.variables) ? '' : templateSrv.variables.filter(function (variable) {
          return variable.name === "components"
        });
        var tComponent = _.isEmpty(tComponents) ? '' : tComponents[0].current.value;


        // Templated Variable for HBase Users
        // It will search the cluster and populate the HBase Users.
        if (interpolated === "hbase-users") {
          return this.initMetricAppidMapping()
            .then(function () {
              var hbaseUsers = allMetrics["hbase"];
              var extractUsers = hbaseUsers.filter(/./.test.bind(new RegExp("regionserver.Users.", 'g')));
              var removeUser = "regionserver.Users.numUsers";
              var i = extractUsers.indexOf(removeUser);
              if (i !== -1) {
                extractUsers.splice(i, 1);
              }
              var userPrefix = "regionserver.Users.";
              var users = _.map(extractUsers, function (user) {
                return user.substring(userPrefix.length);
              });
              users = _.map(users, function (userName) {
                return userName.substring(0, userName.lastIndexOf("_metric"));
              });
              users = _.sortBy(_.uniq(users));
              return _.map(users, function (users) {
                return {
                  text: users
                };
              });
            });
        }
        // Templated Variable for HBase Tables.
        // It will search the cluster and populate the hbase-tables.
        if (interpolated === "hbase-tables") {
          return this.initMetricAppidMapping()
            .then(function () {
              var hbaseTables = allMetrics["hbase"];
              var extractTables = hbaseTables.filter(/./.test.bind(new RegExp("regionserver.Tables.", 'g')));
              var removeTable = "regionserver.Tables.numTables";
              var i = extractTables.indexOf(removeTable);
              if (i != -1) {
                extractTables.splice(i, 1);
              }
              var tablePrefix = "regionserver.Tables.";
              var tables = _.map(extractTables, function (user) {
                return user.substring(tablePrefix.length);
              });
              tables = _.map(tables, function (userName) {
                return userName.substring(0, userName.lastIndexOf("_metric"));
              });
              tables = _.sortBy(_.uniq(tables));
              return _.map(tables, function (tables) {
                return {
                  text: tables
                };
              });
            });
        }
        // Templated Variable for Kafka Topics.
        // It will search the cluster and populate the topics.
        if (interpolated === "kafka-topics") {
          return this.initMetricAppidMapping()
            .then(function () {
              var kafkaTopics = allMetrics["kafka_broker"];
              var extractTopics = kafkaTopics.filter(/./.test.bind(new RegExp("\\b.log.Log.\\b", 'g')));
              var topics = _.map(extractTopics, function (topic) {
                var topicPrefix = "topic.";
                return topic.substring(topic.lastIndexOf(topicPrefix) + topicPrefix.length, topic.length);
              });
              topics = _.sortBy(_.uniq(topics));
              var i = topics.indexOf("ambari_kafka_service_check");
              if (i != -1) {
                topics.splice(i, 1);
              }
              return _.map(topics, function (topics) {
                return {
                  text: topics
                };
              });
            });
        }

        //Templated Variables for Call Queue Metrics
        if (interpolated === "callers") {
          return this.initMetricAppidMapping()
            .then(function () {
              var nnCallers = allMetrics["namenode"];
              var extractCallers = nnCallers.filter(/./.test.bind(new
              RegExp("ipc.client.org.apache.hadoop.ipc.DecayRpcScheduler.Caller", 'g')));
              var callers = _.sortBy(_.uniq(_.map(extractCallers, function (caller) {
                return caller.substring(caller.indexOf('(') + 1, caller.indexOf(')'))
              })));
              return _.map(callers, function (callers) {
                return {
                  text: callers
                };
              });
            });
        }

        var cores = [];
        //Templated Variables for Infra Solr Cores
        if (interpolated === "infra_solr_core") {
          return this.initMetricAppidMapping()
            .then(function () {
              var solrMetrics = allMetrics["ambari-infra-solr"];
              var extractCores = solrMetrics.filter(/./.test.bind(new
              RegExp("^infra.solr.core.", 'g')));
              _.map(extractCores, function (core) {
                // Core naming convention is infra.solr.core.<collection_name>.<shard>.<replica>.<metric_name>
                // coreName should be <collection_name>.<shard>.<replica>
                core = core.split('.');
                var coreName = core.slice(3, 6).join(".");
                if (cores.indexOf(coreName) < 0) {
                  cores.push(coreName);
                }
              });
              return _.map(cores, function (cores) {
                return {
                  text: cores
                };
              });
            });
        }

        var collections = [];
        //Templated Variables for Infra Solr Collections
        if (interpolated === "infra_solr_collection") {
          return this.initMetricAppidMapping()
            .then(function () {
              var solrMetrics = allMetrics["ambari-infra-solr"];
              var extractCollections = solrMetrics.filter(/./.test.bind(new
              RegExp("^infra.solr.core.", 'g')));
              _.map(extractCollections, function (core) {
                // Core naming convention is infra.solr.core.<collection_name>.<shard>.<replica>.<metric_name>
                core = core.split('.');
                var collection = core[3];
                if (collections.indexOf(collection) < 0) {
                  collections.push(collection);
                }
              });
              return _.map(collections, function (collections) {
                return {
                  text: collections
                };
              });
            });
        }

        var topologies = {};
        //Templated Variables for Storm Topologies
        if (interpolated === "topologies") {
          return this.initMetricAppidMapping()
            .then(function () {
              var storm = allMetrics["nimbus"];
              var extractTopologies = storm.filter(/./.test.bind(new
              RegExp("^topology.", 'g')));
              _.map(extractTopologies, function (topology) {
                // Topology naming convention is topology.<topology-name>.component.
                topology = topology.split('.').slice(0, 3);
                if (topologies[topology[1]]) {
                  topologies[topology[1]].push(topology[2]);
                } else {
                  topologies[topology[1]] = [topology[2]];
                }
              });
              return _.map(Object.keys(topologies), function (topologyNames) {
                return {
                  text: topologyNames
                };
              });
            });
        }
        //Templated Variables for Storm Components per Topology
        if (interpolated.indexOf("stormComponent") >= 0) {
          var componentName = interpolated.substring(0, interpolated.indexOf('.'));
          return this.initMetricAppidMapping()
            .then(function () {
              var storm = allMetrics["nimbus"];
              var extractTopologies = storm.filter(/./.test.bind(new
              RegExp("^topology.", 'g')));
              _.map(extractTopologies, function (topology) {
                topology = topology.split('.').slice(0, 3);
                if (topologies[topology[1]]) {
                  topologies[topology[1]].push(topology[2]);
                } else {
                  topologies[topology[1]] = [topology[2]];
                }
              });
              // Retrieve unique component names from the list.
              var compName = _.uniq(topologies[componentName]);
              // Remove "kafka-topic" from the list of components.
              var remove = compName.indexOf('kafka-topic');
              if (remove > -1) {
                compName.splice(remove, 1);
              }
              return _.map(compName, function (components) {
                return {
                  text: components
                };
              });
            });
        }
        var stormEntities = {};
        this.getStormEntities = function () {
          return this.initMetricAppidMapping()
            .then(function () {
              var storm = allMetrics["nimbus"];
              var extractTopologies = storm.filter(/./.test.bind(new
              RegExp("partition", 'g')));
              _.map(extractTopologies, function (topology) {
                topology = topology.split('.').slice(0, 5);
                var topologyName = topologyN = topology[1]; // Topology
                var topologyTopicName = topicN = topology[3]; // Topic
                var topologyTopicPartitionName = topology[4]; // Partition
                if (stormEntities[topologyName]) {
                  if (stormEntities[topologyName][topologyTopicName]) {
                    stormEntities[topologyName][topologyTopicName].push(topologyTopicPartitionName);
                  } else {
                    stormEntities[topologyName][topologyTopicName] = [topologyTopicPartitionName];
                  }
                } else {
                  stormEntities[topologyName] = {};
                  stormEntities[topologyName][topologyTopicName] = [topologyTopicPartitionName];
                }
              });
            });
        };
        //Templated Variables for Storm Topics per Topology
        if (interpolated.indexOf("stormTopic") >= 0) {
          var topicName = interpolated.substring(0, interpolated.indexOf('.'));
          return this.getStormEntities().then(function () {
            var topicNames = Object.keys(stormEntities[topicName]);
            return _.map(topicNames, function (names) {
              return {
                text: names
              };
            });
          });
        }
        //Templated Variables for Storm Partitions per Topic
        if (interpolated.indexOf("stormPartition") >= 0) {
          var topicN, topologyN;
          return this.getStormEntities().then(function () {
            var partitionNames = _.uniq(stormEntities[topologyN][topicN]);
            return _.map(partitionNames, function (names) {
              return {
                text: names
              };
            });
          });
        }
        // Templated Variable for YARN Queues.
        // It will search the cluster and populate the queues.
        if (interpolated === "yarnqueues") {
          return this.initMetricAppidMapping()
            .then(function () {
              var yarnqueues = allMetrics["resourcemanager"];
              var extractQueues = yarnqueues.filter(/./.test.bind(new RegExp(".=root", 'g')));
              var queues = _.map(extractQueues, function (metric) {
                return metric.substring("yarn.QueueMetrics.Queue=".length);
              });
              queues = _.map(queues, function (metricName) {
                return metricName.substring(metricName.lastIndexOf("."), 0);
              });
              queues = _.sortBy(_.uniq(queues));
              return _.map(queues, function (queues) {
                return {
                  text: queues
                };
              });
            });
        }

        // Templated Variable for DruidServices.
        // It will search the cluster and populate the druid service names.
        if (interpolated === "druidServices") {
          return this.initMetricAppidMapping()
            .then(function () {
              var druidMetrics = allMetrics["druid"];
              // Assumption: each node always emits jvm metrics
              var extractNodeTypes = druidMetrics.filter(/./.test.bind(new RegExp("jvm/gc/time", 'g')));
              var nodeTypes = _.map(extractNodeTypes, function (metricName) {
                return metricName.substring(0, metricName.indexOf("."));
              });
              nodeTypes = _.sortBy(_.uniq(nodeTypes));
              return _.map(nodeTypes, function (nodeType) {
                return {
                  text: nodeType
                };
              });
            });
        }

        // Templated Variable for Druid datasources.
        // It will search the cluster and populate the druid datasources.
        if (interpolated === "druidDataSources") {
          return this.initMetricAppidMapping()
            .then(function () {
              var druidMetrics = allMetrics["druid"];
              // Assumption: query/time is emitted for each datasource
              var extractDataSources = druidMetrics.filter(/./.test.bind(new RegExp("query/time", 'g')));
              var dataSources = _.map(extractDataSources, function (metricName) {
                return metricName.split('.')[1]
              });
              dataSources = _.sortBy(_.uniq(dataSources));
              return _.map(dataSources, function (dataSource) {
                return {
                  text: dataSource
                };
              });
            });
        }

        // Templated Variable for Druid query type.
        // It will search the cluster and populate the druid query types.
        if (interpolated === "druidQueryTypes") {
          return this.initMetricAppidMapping()
            .then(function () {
              var druidMetrics = allMetrics["druid"];
              // Assumption: query/time is emitted for each query type.
              var extractQueryTypes = druidMetrics.filter(/./.test.bind(new RegExp("query/time", 'g')));
              var queryTypes = _.map(extractQueryTypes, function (metricName) {
                return metricName.split('.')[2]
              });
              queryTypes = _.sortBy(_.uniq(queryTypes));
              return _.map(queryTypes, function (queryType) {
                return {
                  text: queryType
                };
              });
            });
        }

        if (interpolated == 'hosts') {
          return this.suggestHosts(tComponent, templatedCluster);
        } else if (interpolated == 'cluster') {
          return this.suggestClusters(tComponent)
        }
      };

      /**
       * AMS Datasource  - Test Data Source Connection.
       *
       * Added Check to see if Datasource is working. Throws up an error in the
       * Datasources page if incorrect info is passed on.
       */
      this.testDatasource = function () {
        return this.doAmbariRequest({
          url: '/ws/v1/timeline/metrics/metadata',
          method: 'GET'
        }).then(function (response) {
          console.log(response);
          if (response.status === 200) {
            return {status: "success", message: "Data source is working", title: "Success"};
          }
        });
      };

      /**
       * AMS Datasource - Suggest AppId.
       *
       * Read AppIds from cache.
       */
      this.suggestApps = function (query) {
        console.log(query);

        appIds = appIds.sort();
        var appId = _.map(appIds, function (k) {
          return {text: k};
        });
        return $q.when(appId);
      };

      /**
       * AMS Datasource - Suggest Metrics.
       *
       * Read Metrics based on AppId chosen.
       */
      this.suggestMetrics = function (query, app) {
        if (!app) {
          return $q.when([]);
        }
        var keys = [];
        keys = _.map(allMetrics[app], function (m) {
          return {text: m};
        });
        keys = _.sortBy(keys, function (i) {
          return i.text.toLowerCase();
        });
        return $q.when(keys);
      };

      this.suggestClusters = function (app) {
        if (!app) {
          app = '';
        }
        return this.doAmbariRequest({
          method: 'GET',
          url: '/ws/v1/timeline/metrics/instances?' + 'appId=' + app
        }).then(function (response) {
          var clusters = [];
          var data = response.data;
          for (var cluster in data) {
            if (data[cluster].hasOwnProperty(app)) {
              clusters.push({text: cluster});
            }
          }
          return $q.when(clusters);
        });
      };

      /**
       * AMS Datasource - Suggest Hosts.
       *
       * Query Hosts on the cluster.
       */
      this.suggestHosts = function (app, cluster) {
        if (!app) {
          app = '';
        }
        if (!cluster) {
          cluster = '';
        }
        return this.doAmbariRequest({
          method: 'GET',
          url: '/ws/v1/timeline/metrics/instances?' + 'appId=' + app + '&instanceId=' + cluster
        }).then(function (response) {
          var hosts = [];
          var data = response.data;
          for (var cluster in data) {
            var appHosts = data[cluster][app];
            if (appHosts) {
              for (var index in appHosts) {
                hosts.push({text: appHosts[index]});
              }
            }
          }
          return $q.when(hosts);
        });
      };

      /**
       * AMS Datasource Aggregators.
       */
      var aggregatorsPromise = null;
      this.getAggregators = function () {
        if (aggregatorsPromise) {
          return aggregatorsPromise;
        }
        aggregatorsPromise = $q.when([
          'none', 'avg', 'sum', 'min', 'max'
        ]);
        return aggregatorsPromise;
      };
    };

    return {
      AmbariMetricsDatasource: AmbariMetricsDatasource
    };


  });

