// 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 'common/package_command.dart';
import 'common/repository_package.dart';

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

  static const String _type = 'type';
  static const String _allPackage = 'package-or-subpackage';
  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 _package:
        await for (final PackageEnumerationEntry entry in getTargetPackages()) {
          print(entry.package.path);
        }
      case _example:
        final Stream<RepositoryPackage> examples = getTargetPackages()
            .expand<RepositoryPackage>(
                (PackageEnumerationEntry entry) => entry.package.getExamples());
        await for (final RepositoryPackage package in examples) {
          print(package.path);
        }
      case _allPackage:
        await for (final PackageEnumerationEntry entry
            in getTargetPackagesAndSubpackages()) {
          print(entry.package.path);
        }
      case _file:
        await for (final File file in getFiles()) {
          print(file.path);
        }
    }
  }
}
