
package com.jetbrains.teamcity.command;

import com.jetbrains.teamcity.*;
import java.text.MessageFormat;
import java.util.Comparator;
import java.util.TreeSet;
import javax.naming.directory.InvalidAttributesException;
import jetbrains.buildServer.core.runtime.IProgressMonitor;

class Help implements ICommand {

  static final String ID = Messages.getString("Help.command.id"); //$NON-NLS-1$
  private String myResultDescription;

  public void execute(Server server, final Args args, final IProgressMonitor monitor) throws EAuthorizationException, ECommunicationException, ERemoteError, InvalidAttributesException {

    final StringBuffer buffer = new StringBuffer();

    buffer.append(MessageFormat.format(Messages.getString("Help.command.header"), //$NON-NLS-1$
        Build.build));

    final String commandId = args != null && args.getArguments() != null && args.getArguments().length > 0 ? args.getArguments()[0] : null;
    if (args != null && args.getCommandId() != null && args.getCommandId().equals(ID) && commandId != null && !commandId.equals(ID)) {// help
                                                                                                                                      // command
                                                                                                                                      // used
      buffer.append(printDescription(commandId));
      myResultDescription = buffer.toString();
      return;

    }
    if (args != null && args.getCommandId() != null && !args.getCommandId().equals(ID)) { // no
                                                                                          // help
                                                                                          // command
                                                                                          // used
      buffer.append(printDescription(args.getCommandId()));
      myResultDescription = buffer.toString();

    } else {// nothing passed
      buffer.append(printDefault());
      myResultDescription = buffer.toString();
    }

  }

  private String printDefault() {
    final StringBuffer buffer = new StringBuffer();
    buffer.append(Messages.getString("Help.tool.usage.description")); //$NON-NLS-1$
    // print command list
    buffer.append(Messages.getString("Help.available.commands.list.header")); //$NON-NLS-1$
    final TreeSet<ICommand> knownCommands = new TreeSet<ICommand>(new Comparator<ICommand>() {
      public int compare(ICommand o1, ICommand o2) {
        return o1.getId().compareTo(o2.getId());
      }
    });

    knownCommands.addAll(CommandRegistry.getInstance().commands());
    for (final ICommand command : knownCommands) {
      buffer.append(MessageFormat.format(Messages.getString("Help.available.commands.list.pattern"), prepare(String.valueOf(command.getId())), String.valueOf(command.getCommandDescription()))); //$NON-NLS-1$
    }
    buffer.append(Messages.getString("Help.command.usage.text")); //$NON-NLS-1$
    buffer.append(printGlobalOptions());
    return buffer.toString();
  }

  private static String prepare(final String s) {
    return s.length() < 4 ? s + "\t" : s;
  }

  private String printGlobalOptions() {
    final String globalOptions = Messages.getString("Help.global.options.header"); //$NON-NLS-1$
    return MessageFormat.format(globalOptions, CommandRunner.HOST_ARG, CommandRunner.USER_ARG, CommandRunner.PASSWORD_ARG, Args.DEBUG_ARG, Args.DEBUG_CLEAN_OFF);
  }

  private String printDescription(final String commandId) {
    StringBuffer buffer = new StringBuffer();
    final ICommand command = CommandRegistry.getInstance().getCommand(commandId);
    if (command != null && command.getId().equals(commandId)) {
      buffer.append(command.getUsageDescription());
      buffer.append(printGlobalOptions());
      return buffer.toString();
    } else {
      buffer.append(MessageFormat.format(Messages.getString("Help.no.one.registered.command.found.message"), commandId)); //$NON-NLS-1$
      buffer.append(printDefault());
      return buffer.toString();
    }
  }

  public String getId() {
    return ID;
  }

  public boolean isConnectionRequired(final Args args) {
    return false;
  }

  public String getUsageDescription() {
    return getCommandDescription();
  }

  public String getCommandDescription() {
    return Messages.getString("Help.command.description"); //$NON-NLS-1$
  }

  public String getResultDescription() {
    return myResultDescription;
  }

  public void validate(Args args) throws IllegalArgumentException {
    // TODO Auto-generated method stub

  }

}