// 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 'common/plugin_command.dart';

/// A command to list different types of repository content.
class ListCommand extends PluginCommand {
  /// Creates an instance of the list command, whose behavior depends on the
  /// 'type' argument it provides.
  ListCommand(
    Directory packagesDir, {
    Platform platform = const LocalPlatform(),
  }) : super(packagesDir, platform: platform) {
    argParser.addOption(
      _type,
      defaultsTo: _plugin,
      allowed: <String>[_plugin, _example, _package, _file],
      help: 'What type of file system content to list.',
    );
  }

  static const String _type = 'type';
  static const String _plugin = 'plugin';
  static const String _example = 'example';
  static const String _package = 'package';
  static const String _file = 'file';

  @override
  final String name = 'list';

  @override
  final String description = 'Lists packages or files';

  @override
  Future<void> run() async {
    switch (getStringArg(_type)) {
      case _plugin:
        await for (final PackageEnumerationEntry package
            in getTargetPackages()) {
          print(package.directory.path);
        }
        break;
      case _example:
        final Stream<Directory> examples = getTargetPackages()
            .map((PackageEnumerationEntry entry) => entry.directory)
            .expand<Directory>(getExamplesForPlugin);
        await for (final Directory package in examples) {
          print(package.path);
        }
        break;
      case _package:
        await for (final PackageEnumerationEntry package
            in getTargetPackagesAndSubpackages()) {
          print(package.directory.path);
        }
        break;
      case _file:
        await for (final File file in getFiles()) {
          print(file.path);
        }
        break;
    }
  }
}
