// Copyright 2013 The Flutter Authors. 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' as io;

import 'package:platform/platform.dart';

import 'process_runner.dart';
import 'repository_package.dart';

/// Runs either `dart pub get` or `flutter pub get` in [package], depending on
/// the package type.
///
/// If [alwaysUseFlutter] is true, it will use `flutter pub get` regardless.
/// This can be useful, for instance, to get the `flutter`-default behavior
/// of fetching example packages as well.
///
/// If [streamOutput] is false, output will only be printed if the command
/// fails.
Future<bool> runPubGet(
    RepositoryPackage package, ProcessRunner processRunner, Platform platform,
    {bool alwaysUseFlutter = false, bool streamOutput = true}) async {
  // Running `dart pub get` on a Flutter package can fail if a non-Flutter Dart
  // is first in the path, so use `flutter pub get` for any Flutter package.
  final bool useFlutter = alwaysUseFlutter || package.requiresFlutter();
  final String command =
      useFlutter ? (platform.isWindows ? 'flutter.bat' : 'flutter') : 'dart';
  final List<String> args = <String>['pub', 'get'];

  final int exitCode;
  if (streamOutput) {
    exitCode = await processRunner.runAndStream(command, args,
        workingDir: package.directory);
  } else {
    final io.ProcessResult result =
        await processRunner.run(command, args, workingDir: package.directory);
    exitCode = result.exitCode;
    if (exitCode != 0) {
      print('${result.stdout}\n${result.stderr}\n');
    }
  }
  return exitCode == 0;
}
