// 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 'dart:io';

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

const BASE_PATH = '/api/dartservices/v2/';

const count = 200;

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

const flutterSource = """import 'package:flutter/material.dart';

void main() {
  final widget = Container(color: Colors.white);
  runApp(widget);
}
""";

const dartData = {'offset': 17, 'source': dartSource};
const dartCompileData = {'source': dartSource};
const dartDocData = {'offset': 84, 'source': dartSource};
const flutterData = {'offset': 96, 'source': flutterSource};
const flutterCompileDDCData = {'source': flutterSource};
const flutterDocData = {'offset': 93, 'source': flutterSource};

final dartPayload = convert.json.encode(dartData);
final dartCompilePayload = convert.json.encode(dartCompileData);
final dartDocPayload = convert.json.encode(dartDocData);
final flutterPayload = convert.json.encode(flutterData);
final flutterCompileDDCPayload = convert.json.encode(flutterCompileDDCData);
final flutterDocPayload = convert.json.encode(flutterDocData);

String uri;

Future<void> main(List<String> args) async {
  String appHost;

  if (args.isNotEmpty) {
    appHost = '${args[0]}';
  } else {
    print('''Pass the fully qualified dart-services hostname (no protocol, no
path) as the first argument when invoking this script.

For example:

dart warmup.dart 20200124t152413-dot-dart-services-0.appspot.com
''');

    exit(1);
  }

  if (!appHost.startsWith('http://') && !appHost.startsWith('https://')) {
    appHost = 'http://$appHost';
  }
  uri = '$appHost$BASE_PATH';

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

  for (var j = 0; j < count; j++) {
    await request('Dart', 'complete', dartPayload);
    await request('Dart', 'analyze', dartPayload);
    await request('Dart', 'compile', dartCompilePayload);
    await request('Dart', 'document', dartDocPayload);
    await request('Flutter', 'complete', flutterPayload);
    await request('Flutter', 'analyze', flutterPayload);
    await request('Flutter', 'compileDDC', flutterCompileDDCPayload);
    await request('Flutter', 'document', flutterDocPayload);
  }
}

Future<int> request(String codeType, String verb, String postPayload) async {
  final sw = Stopwatch()..start();

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

  final status = response.statusCode;

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

  return response.statusCode;
}
