// Copyright (c) 2014, 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.

library pub.command.global_activate;

import 'dart:async';

import 'package:pub_semver/pub_semver.dart';

import '../command.dart';
import '../utils.dart';

/// Handles the `global activate` pub command.
class GlobalActivateCommand extends PubCommand {
  String get name => "activate";
  String get description => "Make a package's executables globally available.";
  String get invocation => "pub global activate <package...>";

  GlobalActivateCommand() {
    argParser.addOption(
        "source",
        abbr: "s",
        help: "The source used to find the package.",
        allowed: ["git", "hosted", "path"],
        defaultsTo: "hosted");

    argParser.addFlag(
        "no-executables",
        negatable: false,
        help: "Do not put executables on PATH.");

    argParser.addOption(
        "executable",
        abbr: "x",
        help: "Executable(s) to place on PATH.",
        allowMultiple: true);

    argParser.addFlag(
        "overwrite",
        negatable: false,
        help: "Overwrite executables from other packages with the same name.");
  }

  Future run() {
    // Default to `null`, which means all executables.
    var executables;
    if (argResults.wasParsed("executable")) {
      if (argResults.wasParsed("no-executables")) {
        usageException("Cannot pass both --no-executables and --executable.");
      }

      executables = argResults["executable"];
    } else if (argResults["no-executables"]) {
      // An empty list means no executables.
      executables = [];
    }

    var overwrite = argResults["overwrite"];
    var args = argResults.rest;

    readArg([String error]) {
      if (args.isEmpty) usageException(error);
      var arg = args.first;
      args = args.skip(1);
      return arg;
    }

    validateNoExtraArgs() {
      if (args.isEmpty) return;
      var unexpected = args.map((arg) => '"$arg"');
      var arguments = pluralize("argument", unexpected.length);
      usageException("Unexpected $arguments ${toSentence(unexpected)}.");
    }

    switch (argResults["source"]) {
      case "git":
        var repo = readArg("No Git repository given.");
        // TODO(rnystrom): Allow passing in a Git ref too.
        validateNoExtraArgs();
        return globals.activateGit(
            repo,
            executables,
            overwriteBinStubs: overwrite);

      case "hosted":
        var package = readArg("No package to activate given.");

        // Parse the version constraint, if there is one.
        var constraint = VersionConstraint.any;
        if (args.isNotEmpty) {
          try {
            constraint = new VersionConstraint.parse(readArg());
          } on FormatException catch (error) {
            usageException(error.message);
          }
        }

        validateNoExtraArgs();
        return globals.activateHosted(
            package,
            constraint,
            executables,
            overwriteBinStubs: overwrite);

      case "path":
        var path = readArg("No package to activate given.");
        validateNoExtraArgs();
        return globals.activatePath(
            path,
            executables,
            overwriteBinStubs: overwrite);
    }

    throw "unreachable";
  }
}
