// 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:async';
import 'dart:io' as io;

import 'package:args/command_runner.dart';
import 'package:path/path.dart' as path;

import 'environment.dart';
import 'utils.dart';

class CleanCommand extends Command<bool> with ArgUtils<bool> {
  CleanCommand() {
    argParser
      ..addFlag(
        'flutter',
        defaultsTo: true,
        help: 'Cleans up the .dart_tool directory under engine/src/flutter. Enabled by default.',
      )
      ..addFlag(
        'ninja',
        help: 'Also clean up the engine out directory with ninja output. Disabled by default.',
      );
  }

  @override
  String get name => 'clean';

  bool get _alsoCleanNinja => boolArg('ninja');

  bool get _alsoCleanFlutterRepo => boolArg('flutter');

  @override
  String get description => 'Deletes build caches and artifacts.';

  @override
  FutureOr<bool> run() async {
    // This is the old path that tests used to be built into. Clean this path too.
    final String legacyBuildPath = path.join(environment.webUiRootDir.path, 'build');
    final List<io.FileSystemEntity> thingsToBeCleaned = <io.FileSystemEntity>[
      environment.webUiDartToolDir,
      environment.webUiBuildDir,
      io.Directory(legacyBuildPath),
      io.File(path.join(environment.webUiRootDir.path, '.dart_tool', 'package_config.json')),
      io.File(path.join(environment.webUiRootDir.path, 'pubspec.lock')),
      if (_alsoCleanNinja)
        environment.outDir,
      if(_alsoCleanFlutterRepo)
        environment.engineDartToolDir,
    ];

    await Future.wait(
      thingsToBeCleaned
        .where((io.FileSystemEntity entity) => entity.existsSync())
        .map((io.FileSystemEntity entity) => entity.delete(recursive: true))
    );
    return true;
  }
}
