// 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 'package:file/file.dart';
import 'package:platform/platform.dart';

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

const String _gradleWrapperWindows = 'gradlew.bat';
const String _gradleWrapperNonWindows = 'gradlew';

/// A utility class for interacting with Gradle projects.
class GradleProject {
  /// Creates an instance that runs commands for [project] with the given
  /// [processRunner].
  GradleProject(
    this.flutterProject, {
    this.processRunner = const ProcessRunner(),
    this.platform = const LocalPlatform(),
  });

  /// The directory of a Flutter project to run Gradle commands in.
  final RepositoryPackage flutterProject;

  /// The [ProcessRunner] used to run commands. Overridable for testing.
  final ProcessRunner processRunner;

  /// The platform that commands are being run on.
  final Platform platform;

  /// The project's 'android' directory.
  Directory get androidDirectory =>
      flutterProject.platformDirectory(FlutterPlatform.android);

  /// The path to the Gradle wrapper file for the project.
  File get gradleWrapper => androidDirectory.childFile(
      platform.isWindows ? _gradleWrapperWindows : _gradleWrapperNonWindows);

  /// Whether or not the project is ready to have Gradle commands run on it
  /// (i.e., whether the `flutter` tool has generated the necessary files).
  bool isConfigured() => gradleWrapper.existsSync();

  /// Runs a `gradlew` command with the given parameters.
  Future<int> runCommand(
    String target, {
    List<String> arguments = const <String>[],
  }) {
    return processRunner.runAndStream(
      gradleWrapper.path,
      <String>[target, ...arguments],
      workingDir: androidDirectory,
    );
  }
}
