// 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.

library cli_util;

import 'dart:io';

import 'package:which/which.dart';

/// Return the path to the current Dart SDK. This will return `null` if we are
/// unable to locate the Dart SDK.
Directory getSdkDir([List<String> cliArgs]) {
  // Look for --dart-sdk on the command line.
  if (cliArgs != null) {
    int index = cliArgs.indexOf('--dart-sdk');

    if (index != -1 && (index + 1 < cliArgs.length)) {
      return new Directory(cliArgs[index + 1]);
    }

    for (String arg in cliArgs) {
      if (arg.startsWith('--dart-sdk=')) {
        return new Directory(arg.substring('--dart-sdk='.length));
      }
    }
  }

  // Look in env['DART_SDK']
  if (Platform.environment['DART_SDK'] != null) {
    return new Directory(Platform.environment['DART_SDK']);
  }

  // Look relative to the dart executable.
  Directory sdkDirectory = new File(Platform.executable).parent.parent;
  if (_isSdkDir(sdkDirectory)) return sdkDirectory;

  // Try and locate the VM using 'which'.
  String executable = whichSync('dart', orElse: () => null);
  if (executable == null) return null;

  // In case Dart is symlinked (e.g. homebrew on Mac) follow symbolic links.
  Link link = new Link(executable);
  if (link.existsSync()) {
    executable = link.resolveSymbolicLinksSync();
  }

  File dartVm = new File(executable);
  Directory dir = dartVm.parent.parent;
  if (_isSdkDir(dir)) return dir;

  return null;
}

bool _isSdkDir(Directory dir) => _joinFile(dir, ['version']).existsSync();

File _joinFile(Directory dir, List<String> files) {
  String pathFragment = files.join(Platform.pathSeparator);
  return new File("${dir.path}${Platform.pathSeparator}${pathFragment}");
}
