// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:async';
import 'dart:convert' as convert;

import 'package:http/http.dart' as http;

String uri;

const BASE_URI = 'dart-services.appspot.com/api/dartservices/v1/';
// const BASE_URI = "localhost:8080/api/dartservices/v1/";
const count = 200;

Future main(List<String> args) async {
  String appPrefix;
  if (args.isNotEmpty) {
    appPrefix = '${args[0]}.';
  } else {
    appPrefix = '';
  }

  // Use an insecure connection for test driving to avoid cert problems
  // with the prefixed app version.
  uri = 'http://$appPrefix$BASE_URI';

  print('Target URI\n$uri');

  String source =
      "import 'dart:html'; void main() { var a = 3; var b = a.abs(); int c = 7;}";

  for (int j = 0; j < count; j++) {
    var data = {'offset': 17, 'source': source};
    var dartdocData = {'offset': 84, 'source': source};

    String postPayload = convert.json.encode(data);
    String postPayloadDartdoc = convert.json.encode(dartdocData);

    await request('complete', postPayload);
    await request('analyze', postPayload);
    await request('compile', postPayload);
    await request('document', postPayloadDartdoc);
  }
}

Future request(String verb, String postPayload) async {
  Stopwatch sw = Stopwatch()..start();

  var response = await http.post(Uri.parse(uri + verb),
      body: postPayload,
      headers: {'content-type': 'text/plain; charset=utf-8'});

  int status = response.statusCode;

  if (status != 200) {
    print('$verb \t $status \t ${response.body} ${response.headers}');
  } else {
    print('$verb \t ${sw.elapsedMilliseconds} \t $status');
  }
  return response.statusCode;
}
