// Copyright (c) 2012, 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 command_uploader;

import 'dart:async';
import 'dart:io';
import 'dart:uri';

import '../../pkg/args/lib/args.dart';
import '../../pkg/pathos/lib/path.dart' as path;
import 'entrypoint.dart';
import 'exit_codes.dart' as exit_codes;
import 'http.dart';
import 'io.dart';
import 'log.dart' as log;
import 'oauth2.dart' as oauth2;
import 'pub.dart';
import 'utils.dart';

/// Handles the `uploader` pub command.
class UploaderCommand extends PubCommand {
  final description = "Manage uploaders for a package on pub.dartlang.org.";
  final usage = "pub uploader [options] {add/remove} <email>";
  final requiresEntrypoint = false;

  ArgParser get commandParser {
    var parser = new ArgParser();
    // TODO(nweiz): Use HostedSource.defaultUrl as the default value once we use
    // dart:io for HTTPS requests.
    parser.addOption('server', defaultsTo: 'https://pub.dartlang.org',
        help: 'The package server on which the package is hosted');
    parser.addOption('package', help: 'The package whose uploaders will be '
        'modified\n'
        '(defaults to the current package)');
    return parser;
  }

  /// The URL of the package hosting server.
  Uri get server => Uri.parse(commandOptions['server']);

  Future onRun() {
    if (commandOptions.rest.isEmpty) {
      log.error('No uploader command given.');
      this.printUsage();
      exit(exit_codes.USAGE);
    }

    var command = commandOptions.rest.removeAt(0);
    if (!['add', 'remove'].contains(command)) {
      log.error('Unknown uploader command "$command".');
      this.printUsage();
      exit(exit_codes.USAGE);
    } else if (commandOptions.rest.isEmpty) {
      log.error('No uploader given for "pub uploader $command".');
      this.printUsage();
      exit(exit_codes.USAGE);
    }

    return defer(() {
      var package = commandOptions['package'];
      if (package != null) return package;
      return new Entrypoint(path.current, cache).root.name;
    }).then((package) {
      var uploader = commandOptions.rest[0];
      return oauth2.withClient(cache, (client) {
        if (command == 'add') {
          var url = server.resolve("/packages/${encodeUriComponent(package)}"
              "/uploaders.json");
          return client.post(url, fields: {"email": uploader});
        } else { // command == 'remove'
          var url = server.resolve("/packages/${encodeUriComponent(package)}"
              "/uploaders/${encodeUriComponent(uploader)}.json");
          return client.delete(url);
        }
      });
    }).then(handleJsonSuccess).catchError((asyncError) {
      if (asyncError.error is! PubHttpException) throw asyncError;
      handleJsonError(asyncError.error.response);
    });
  }
}
