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

import 'package:path/path.dart';

import 'main.dart' as performance;

// Local driver for performance measurement

void main(List<String> args) {
  /*
   * Parse arguments
   */
  if (args.length < 3) printHelp('Expected 3 arguments');
  var gitDir = Directory(args[0]);
  if (!gitDir.existsSync()) printHelp('${gitDir.path} does not exist');
  if (!Directory(join(gitDir.path, '.git')).existsSync()) {
    printHelp('${gitDir.path} does not appear to be a local git repository');
  }
  var branch = args[1];
  var inputFile = File(args[2]);
  if (!inputFile.existsSync()) printHelp('${inputFile.path} does not exist');
  /*
   * Create a new temp directory
   */
  var tmpDir =
      Directory(join(Directory.systemTemp.path, 'analysis_server_perf_target'));
  if (!tmpDir.path.contains('tmp')) throw 'invalid tmp directory\n  $tmpDir';
  print('Extracting target analysis environment into\n  ${tmpDir.path}');
  if (tmpDir.existsSync()) tmpDir.deleteSync(recursive: true);
  tmpDir.createSync(recursive: true);
  /*
   * Setup the initial target source in the temp directory
   */
  var tarFilePath = join(tmpDir.path, 'targetSrc.tar');
  var result = Process.runSync('git', ['archive', branch, '-o', tarFilePath],
      workingDirectory: gitDir.path);
  if (result.exitCode != 0) throw 'failed to obtain target source: $result';
  var tmpSrcDirPath = join(tmpDir.path, 'targetSrc');
  Directory(tmpSrcDirPath).createSync();
  result = Process.runSync('tar', ['-xf', tarFilePath],
      workingDirectory: tmpSrcDirPath);
  if (result.exitCode != 0) throw 'failed to extract target source: $result';
  /*
   * Symlink the out or xcodebuild directory
   */
  var outDirName = 'out';
  if (!Directory(join(gitDir.path, outDirName)).existsSync()) {
    outDirName = 'xcodebuild';
  }
  if (!Directory(join(gitDir.path, outDirName)).existsSync()) {
    throw 'failed to find out or xcodebuild directory';
  }
  result = Process.runSync('ln',
      ['-s', join(gitDir.path, outDirName), join(tmpSrcDirPath, outDirName)]);
  if (result.exitCode != 0) throw 'failed to link out or xcodebuild: $result';
  /*
   * Collect arguments
   */
  var perfArgs = [
    '-i${inputFile.path}',
    '-t$tmpSrcDirPath',
  ];
  for (var index = 3; index < args.length; ++index) {
    perfArgs.add(args[index].replaceAll('@tmpSrcDir@', tmpSrcDirPath));
  }
  perfArgs.add('-m${gitDir.path},$tmpSrcDirPath');
  /*
   * Launch the performance analysis tool
   */
  performance.main(perfArgs);
}

/// Print help and exit
void printHelp([String errMsg]) {
  if (errMsg != null) {
    print('');
    print('Error: $errMsg');
    print('');
  }
  print('''Required arguments: <gitDir> <branch> <inputFile>
gitDir = a path to the git repository containing the initial target source
branch = the branch containing the initial target source
inputFile = the instrumentation or log file

Optional arguments:''');
  print(performance.argParser.usage);
  exit(1);
}
