/*
 *
 * Copyright 2016 gRPC authors.
 *
 * Licensed 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.
 *
 */

'use strict';

var _ = require('lodash');

var grpc = require('../../..');

var interop_client = require('../interop/interop_client');
var MetricsServer = require('./metrics_server');

var running;

var metrics_server;

var start_time;
var query_count;

function makeCall(client, test_cases) {
  if (!running) {
    return;
  }
  var test_case = test_cases[_.random(test_cases.length - 1)];
  interop_client.test_cases[test_case].run(client, function() {
    query_count += 1;
    makeCall(client, test_cases);
  });
}

function makeCalls(client, test_cases, parallel_calls_per_channel) {
  _.times(parallel_calls_per_channel, function() {
    makeCall(client, test_cases);
  });
}

function getQps() {
  var diff = process.hrtime(start_time);
  var seconds = diff[0] + diff[1] / 1e9;
  return {long_value: query_count / seconds};
}

function start(server_addresses, test_cases, channels_per_server,
               parallel_calls_per_channel, metrics_port) {
  running = true;
  /* Assuming that we are not calling unimplemented_method. The client class
   * used by empty_unary is (currently) the client class used by every interop
   * test except unimplemented_method */
  var Client = interop_client.test_cases.empty_unary.Client;
  /* Make channels_per_server clients connecting to each server address */
  var channels = _.flatten(_.times(
      channels_per_server, _.partial(_.map, server_addresses, function(address) {
        return new Client(address, grpc.credentials.createInsecure());
      })));
  metrics_server = new MetricsServer(metrics_port);
  metrics_server.registerGauge('qps', getQps);
  start_time = process.hrtime();
  query_count = 0;
  _.each(channels, _.partial(makeCalls, _, test_cases,
                             parallel_calls_per_channel));
  metrics_server.start();
}

function stop() {
  running = false;
  metrics_server.shutdown();
  console.log('QPS: ' + getQps().long_value);
}

function main() {
  var parseArgs = require('minimist');
  var argv = parseArgs(process.argv, {
    string: ['server_addresses', 'test_cases', 'metrics_port'],
    default: {'server_addresses': 'localhost:8080',
              'test_duration_secs': -1,
              'num_channels_per_server': 1,
              'num_stubs_per_channel': 1,
              'metrics_port': '8081'}
  });
  var server_addresses = argv.server_addresses.split(',');
  /* Generate an array of test cases, where the number of instances of each name
   * corresponds to the number given in the argument.
   * e.g. 'empty_unary:1,large_unary:2' =>
   * ['empty_unary', 'large_unary', 'large_unary'] */
  var test_cases = _.flatten(_.map(argv.test_cases.split(','), function(value) {
    var split = value.split(':');
    return _.times(split[1], _.constant(split[0]));
  }));
  start(server_addresses, test_cases, argv.num_channels_per_server,
        argv.num_stubs_per_channel, argv.metrics_port);
  if (argv.test_duration_secs > -1) {
    setTimeout(stop, argv.test_duration_secs * 1000);
  }
}

main();
