// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. 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:path/path.dart' as p;

import '../command.dart';
import '../command_runner.dart';
import '../io.dart';
import '../log.dart' as log;
import '../package_name.dart';
import '../utils.dart';

/// Handles the `list-package-dirs` pub command.
class ListPackageDirsCommand extends PubCommand {
  @override
  String get name => 'list-package-dirs';
  @override
  String get description => 'Print local paths to dependencies.';
  @override
  String get argumentsDescription => '';
  @override
  bool get takesArguments => false;
  @override
  bool get hidden => true;

  ListPackageDirsCommand() {
    argParser.addOption(
      'format',
      help: 'How output should be displayed.',
      allowed: ['json'],
    );
    argParser.addOption(
      'directory',
      abbr: 'C',
      help: 'Run this in the directory <dir>.',
      valueHelp: 'dir',
    );
  }

  @override
  Future<void> runProtected() async {
    log.json.enabled = true;

    if (!fileExists(entrypoint.lockFilePath)) {
      dataError(
        'Package "myapp" has no lockfile. Please run "$topLevelProgram pub get" first.',
      );
    }

    var output = {};

    // Include the local paths to all locked packages.
    var packages = mapMap(
      entrypoint.lockFile.packages,
      value: (String name, PackageId package) {
        var packageDir = cache.getDirectory(package);
        // Normalize paths and make them absolute for backwards compatibility
        // with the protocol used by the analyzer.
        return p.normalize(p.absolute(p.join(packageDir, 'lib')));
      },
    );

    // Include the self link.
    packages[entrypoint.root.name] =
        p.normalize(p.absolute(entrypoint.root.path('lib')));

    output['packages'] = packages;

    // Include the file(s) which when modified will affect the results. For pub,
    // that's just the pubspec and lockfile.
    output['input_files'] = [
      p.normalize(p.absolute(entrypoint.lockFilePath)),
      p.normalize(p.absolute(entrypoint.pubspecPath))
    ];

    log.json.message(output);
  }
}
