// 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 'flutter_utils.dart';
import 'process_utils.dart';

Future<int> runFlutterCommand(
  String projectDirectory,
  String command, [
  List<String> commandArguments = const <String>[],
]) {
  return runProcess(
    getFlutterCommand(),
    <String>[
      command,
      ...commandArguments,
    ],
    workingDirectory: projectDirectory,
  );
}

Future<int> runFlutterBuild(
  String projectDirectory,
  String target, {
  bool debug = true,
  List<String> flags = const <String>[],
}) {
  return runFlutterCommand(
    projectDirectory,
    'build',
    <String>[
      target,
      if (debug) '--debug',
      ...flags,
    ],
  );
}

Future<int> runXcodeBuild(
  String nativeProjectDirectory, {
  String? sdk,
  String? destination,
  List<String> extraArguments = const <String>[],
}) {
  return runProcess(
    'xcodebuild',
    <String>[
      '-workspace',
      'Runner.xcworkspace',
      '-scheme',
      'Runner',
      if (sdk != null) ...<String>['-sdk', sdk],
      if (destination != null) ...<String>['-destination', destination],
      ...extraArguments,
    ],
    workingDirectory: nativeProjectDirectory,
  );
}

Future<int> runGradleBuild(String nativeProjectDirectory, [String? command]) {
  return runProcess(
    './gradlew',
    <String>[
      if (command != null) command,
    ],
    workingDirectory: nativeProjectDirectory,
  );
}
