// Copyright (c) 2018, 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';
import 'dart:io';

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

import '../benchmarks.dart';

/// benchmarks:
///   - analysis-flutter-analyze
class FlutterAnalyzeBenchmark extends Benchmark {
  FlutterAnalyzeBenchmark()
      : super(
          'analysis-flutter-analyze',
          "Clone the flutter/flutter repo and run "
              "'flutter analyze --flutter-repo' with the current Dart VM and "
              "analysis server.",
          kind: 'cpu',
        );

  bool get needsSetup => true;

  Directory flutterDir;

  Future oneTimeSetup() async {
    flutterDir = Directory.systemTemp.createTempSync('flutter');

    // git clone https://github.com/flutter/flutter $flutterDir
    await _runProcess('git', [
      'clone',
      'https://github.com/flutter/flutter',
      path.canonicalize(flutterDir.path)
    ]);

    String flutterTool = path.join(flutterDir.path, 'bin', 'flutter');

    // flutter --version
    await _runProcess(flutterTool, ['--version'], cwd: flutterDir.path);

    // flutter precache
    await _runProcess(flutterTool, ['precache'], cwd: flutterDir.path);

    // flutter update-packages
    await _runProcess(flutterTool, ['update-packages'], cwd: flutterDir.path);
  }

  Future oneTimeCleanup() {
    try {
      flutterDir.deleteSync(recursive: true);
    } on FileSystemException catch (e) {
      print(e);
    }

    return new Future.value();
  }

  int get maxIterations => 3;

  @override
  Future<BenchMarkResult> run({
    bool quick: false,
    bool verbose: false,
  }) async {
    if (!quick) {
      deleteServerCache();
    }

    final String dartSdkPath =
        path.dirname(path.dirname(Platform.resolvedExecutable));

    final Stopwatch stopwatch = new Stopwatch()..start();

    await _runProcess(
      Platform.resolvedExecutable,
      [
        'packages/flutter_tools/bin/flutter_tools.dart',
        'analyze',
        '--flutter-repo',
        '--dart-sdk',
        dartSdkPath,
      ],
      cwd: flutterDir.path,
      failOnError: false,
    );

    stopwatch.stop();

    return new BenchMarkResult('micros', stopwatch.elapsedMicroseconds);
  }
}

Future<int> _runProcess(
  String command,
  List<String> args, {
  String cwd,
  bool failOnError = true,
}) async {
  print('\n$command ${args.join(' ')}');

  Process process = await Process.start(command, args, workingDirectory: cwd);

  process.stdout
      .transform(utf8.decoder)
      .transform(new LineSplitter())
      .listen((line) {
    print('  $line');
  });
  process.stderr
      .transform(utf8.decoder)
      .transform(new LineSplitter())
      .listen((line) => print('  $line'));

  int exitCode = await process.exitCode;
  if (exitCode != 0 && failOnError) {
    throw '$command exited with $exitCode';
  }

  return exitCode;
}
