/*
 * Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.apache.slider.common.params;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.slider.common.SliderXmlConfKeys;
import org.apache.slider.common.tools.SliderUtils;
import org.apache.slider.core.exceptions.BadCommandArgumentsException;
import org.apache.slider.core.exceptions.ErrorStrings;
import org.apache.slider.core.exceptions.SliderException;

import java.util.Collection;

/**
 * Slider Client CLI Args
 */

public class ClientArgs extends CommonArgs {

  /*
   
   All the arguments for specific actions
  
   */
  /**
   * This is not bonded to jcommander, it is set up
   * after the construction to point to the relevant
   * entry
   * 
   * KEEP IN ALPHABETICAL ORDER
   */
  private AbstractClusterBuildingActionArgs buildingActionArgs;
  private final ActionAMSuicideArgs actionAMSuicideArgs = new ActionAMSuicideArgs();
  private final ActionBuildArgs actionBuildArgs = new ActionBuildArgs();
  private final ActionCreateArgs actionCreateArgs = new ActionCreateArgs();
  private final ActionDestroyArgs actionDestroyArgs = new ActionDestroyArgs();
  private final ActionDiagnosticArgs actionDiagnosticArgs = new ActionDiagnosticArgs();
  private final ActionExistsArgs actionExistsArgs = new ActionExistsArgs();
  private final ActionFlexArgs actionFlexArgs = new ActionFlexArgs();
  private final ActionFreezeArgs actionFreezeArgs = new ActionFreezeArgs();
  private final ActionHelpArgs actionHelpArgs = new ActionHelpArgs();
  private final ActionInstallPackageArgs actionInstallPackageArgs = new ActionInstallPackageArgs();
  private final ActionInstallKeytabArgs actionInstallKeytabArgs = new ActionInstallKeytabArgs();
  private final ActionKillContainerArgs actionKillContainerArgs =
    new ActionKillContainerArgs();
  private final ActionListArgs actionListArgs = new ActionListArgs();
  private final ActionLookupArgs actionLookupArgs = new ActionLookupArgs();
  private final ActionRegistryArgs actionRegistryArgs = new ActionRegistryArgs();
  private final ActionResolveArgs actionResolveArgs = new ActionResolveArgs();
  private final ActionStatusArgs actionStatusArgs = new ActionStatusArgs();
  private final ActionThawArgs actionThawArgs = new ActionThawArgs();
  private final ActionUpdateArgs actionUpdateArgs = new ActionUpdateArgs();
  private final ActionVersionArgs actionVersionArgs = new ActionVersionArgs();


  public ClientArgs(String[] args) {
    super(args);
  }

  public ClientArgs(Collection args) {
    super(args);
  }

  @Override
  protected void addActionArguments() {

    addActions(
        actionAMSuicideArgs,
        actionBuildArgs,
        actionCreateArgs,
        actionUpdateArgs,
        actionDestroyArgs,
        actionDiagnosticArgs,
        actionExistsArgs,
        actionFlexArgs,
        actionFreezeArgs,
        actionHelpArgs,
        actionInstallPackageArgs,
        actionInstallKeytabArgs,
        actionKillContainerArgs,
        actionListArgs,
        actionLookupArgs,
        actionRegistryArgs,
        actionResolveArgs,
        actionStatusArgs,
        actionThawArgs,
        actionVersionArgs
    );
  }

  @Override
  public void applyDefinitions(Configuration conf) throws
                                                   BadCommandArgumentsException {
    super.applyDefinitions(conf);
    //RM
    if (getManager() != null) {
      log.debug("Setting RM to {}", getManager());
      conf.set(YarnConfiguration.RM_ADDRESS, getManager());
    }
    if (getBasePath() != null) {
      log.debug("Setting basePath to {}", getBasePath());
      conf.set(SliderXmlConfKeys.KEY_SLIDER_BASE_PATH,
          getBasePath().toString());
    }
  }

  public ActionDiagnosticArgs getActionDiagnosticArgs() {
	  return actionDiagnosticArgs;
  }

  public AbstractClusterBuildingActionArgs getBuildingActionArgs() {
    return buildingActionArgs;
  }

  public ActionAMSuicideArgs getActionAMSuicideArgs() {
    return actionAMSuicideArgs;
  }

  public ActionBuildArgs getActionBuildArgs() {
    return actionBuildArgs;
  }

  public ActionInstallPackageArgs getActionInstallPackageArgs() {
    return actionInstallPackageArgs; }

  public ActionInstallKeytabArgs getActionInstallKeytabArgs() {
    return actionInstallKeytabArgs; }

  public ActionUpdateArgs getActionUpdateArgs() {
    return actionUpdateArgs;
  }

  public ActionCreateArgs getActionCreateArgs() {
    return actionCreateArgs;
  }

  public ActionDestroyArgs getActionDestroyArgs() {
    return actionDestroyArgs;
  }

  public ActionExistsArgs getActionExistsArgs() {
    return actionExistsArgs;
  }

  public ActionFlexArgs getActionFlexArgs() {
    return actionFlexArgs;
  }

  public ActionFreezeArgs getActionFreezeArgs() {
    return actionFreezeArgs;
  }

  public ActionKillContainerArgs getActionKillContainerArgs() {
    return actionKillContainerArgs;
  }

  public ActionListArgs getActionListArgs() {
    return actionListArgs;
  }

  public ActionLookupArgs getActionLookupArgs() {
    return actionLookupArgs;
  }

  public ActionRegistryArgs getActionRegistryArgs() {
    return actionRegistryArgs;
  }

  public ActionResolveArgs getActionResolveArgs() {
    return actionResolveArgs;
  }

  public ActionStatusArgs getActionStatusArgs() {
    return actionStatusArgs;
  }

  public ActionThawArgs getActionThawArgs() {
    return actionThawArgs;
  }

  /**
   * Look at the chosen action and bind it as the core action for the operation.
   * In theory this could be done by introspecting on the list of actions and 
   * choosing it without the switch statement. In practise this switch, while
   * verbose, is easier to debug. And in JDK7, much simpler.
   * @throws SliderException bad argument or similar
   */
  @Override
  public void applyAction() throws SliderException {
    String action = getAction();
    if (SliderActions.ACTION_BUILD.equals(action)) {
      bindCoreAction(actionBuildArgs);
      //its a builder, so set those actions too
      buildingActionArgs = actionBuildArgs;
    } else if (SliderActions.ACTION_CREATE.equals(action)) {
      bindCoreAction(actionCreateArgs);
      //its a builder, so set those actions too
      buildingActionArgs = actionCreateArgs;

    } else if (SliderActions.ACTION_FREEZE.equals(action)) {
      bindCoreAction(actionFreezeArgs);

    } else if (SliderActions.ACTION_THAW.equals(action)) {
      bindCoreAction(actionThawArgs);

    } else if (SliderActions.ACTION_AM_SUICIDE.equals(action)) {
      bindCoreAction(actionAMSuicideArgs);

    } else if (SliderActions.ACTION_DESTROY.equals(action)) {
      bindCoreAction(actionDestroyArgs);

    } else if (SliderActions.ACTION_DIAGNOSTICS.equals(action)) {
      bindCoreAction(actionDiagnosticArgs);

    } else if (SliderActions.ACTION_EXISTS.equals(action)) {
      bindCoreAction(actionExistsArgs);

    } else if (SliderActions.ACTION_FLEX.equals(action)) {
      bindCoreAction(actionFlexArgs);

    } else if (SliderActions.ACTION_HELP.equals(action)) {
      bindCoreAction(actionHelpArgs);

    } else if (SliderActions.ACTION_INSTALL_PACKAGE.equals(action)) {
      bindCoreAction(actionInstallPackageArgs);

    } else if (SliderActions.ACTION_INSTALL_KEYTAB.equals(action)) {
      bindCoreAction(actionInstallKeytabArgs);

    } else if (SliderActions.ACTION_KILL_CONTAINER.equals(action)) {
      bindCoreAction(actionKillContainerArgs);

    } else if (SliderActions.ACTION_LIST.equals(action)) {
      bindCoreAction(actionListArgs);

    } else if (SliderActions.ACTION_LOOKUP.equals(action)) {
      bindCoreAction(actionLookupArgs);

    } else if (SliderActions.ACTION_REGISTRY.equals(action)) {
      bindCoreAction(actionRegistryArgs);

    } else if (SliderActions.ACTION_RESOLVE.equals(action)) {
      bindCoreAction(actionResolveArgs);

    } else if (SliderActions.ACTION_STATUS.equals(action)) {
      bindCoreAction(actionStatusArgs);

    } else if (SliderActions.ACTION_UPDATE.equals(action)) {
      bindCoreAction(actionUpdateArgs);

    } else if (SliderActions.ACTION_VERSION.equals(action)) {
      bindCoreAction(actionVersionArgs);

    } else if (SliderUtils.isUnset(action)) {
      bindCoreAction(actionHelpArgs);

    } else {
      throw new BadCommandArgumentsException(ErrorStrings.ERROR_UNKNOWN_ACTION
                                             + " " + action);
    }
  }
}
