/*
 * 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.solr.common.params;

import java.util.Locale;

import org.apache.solr.common.SolrException;

/**
 * @since solr 1.3
 */
public abstract class CoreAdminParams
{
  /** What Core are we talking about **/
  public final static String CORE = "core";

  /** Should the STATUS request include index info **/
  public final static String INDEX_INFO = "indexInfo";
  
  /** If you rename something, what is the new name **/
  public final static String NAME = "name";

  /** Core data directory **/
  public final static String DATA_DIR = "dataDir";

  /** Core updatelog directory **/
  public final static String ULOG_DIR = "ulogDir";

  /** Name of the other core in actions involving 2 cores **/
  public final static String OTHER = "other";

  /** What action **/
  public final static String ACTION = "action";
  
  /** If you specify a schema, what is its name **/
  public final static String SCHEMA = "schema";

  /** If you specify a configset, what is its name **/
  public final static String CONFIGSET = "configSet";
  
  /** If you specify a config, what is its name **/
  public final static String CONFIG = "config";
  
  /** Specifies a core instance dir. */
  public final static String INSTANCE_DIR = "instanceDir";

  /** If you specify a file, what is its name **/
  public final static String FILE = "file";
  
  /** If you merge indexes, what are the index directories.
   * The directories are specified by multiple indexDir parameters. */
  public final static String INDEX_DIR = "indexDir";

  /** If you merge indexes, what is the source core's name
   * More than one source core can be specified by multiple srcCore parameters */
  public final static String SRC_CORE = "srcCore";

  /** The collection name in solr cloud */
  public final static String COLLECTION = "collection";

  /** The replica name in solr cloud */
  public final static String REPLICA = "replica";
  
  /** The shard id in solr cloud */
  public final static String SHARD = "shard";

  /** The target core to which a split index should be written to
   * Multiple targetCores can be specified by multiple targetCore parameters */
  public final static String TARGET_CORE = "targetCore";

  /** The hash ranges to be used to split a shard or an index */
  public final static String RANGES = "ranges";

  public static final String ROLES = "roles";

  public static final String REQUESTID = "requestid";

  public static final String CORE_NODE_NAME = "coreNodeName";
  
  /** Prefix for core property name=value pair **/
  public final static String PROPERTY_PREFIX = "property.";

  /** If you unload a core, delete the index too */
  public final static String DELETE_INDEX = "deleteIndex";

  public static final String DELETE_DATA_DIR = "deleteDataDir";

  public static final String DELETE_INSTANCE_DIR = "deleteInstanceDir";

  public static final String DELETE_METRICS_HISTORY = "deleteMetricsHistory";

  public static final String LOAD_ON_STARTUP = "loadOnStartup";
  
  public static final String TRANSIENT = "transient";

  // Node to create a replica on for ADDREPLICA at least.
  public static final String NODE = "node";

  /**
   * A parameter to specify the name of the backup repository to be used.
   */
  public static final String BACKUP_REPOSITORY = "repository";

  /**
   * A parameter to specify the location where the backup should be stored.
   */
  public static final String BACKUP_LOCATION = "location";

  /**
   * A parameter to specify the name of the commit to be stored during the backup operation.
   */
  public static final String COMMIT_NAME = "commitName";

  /**
   * A boolean parameter specifying if a core is being created as part of a new collection
   */
  public static final String NEW_COLLECTION = "newCollection";

  /**
   * Tells the CoreAdminHandler that the new Core will be a replica of a particular {@link org.apache.solr.common.cloud.Replica.Type}
   */
  public static final String REPLICA_TYPE = "replicaType";

  public enum CoreAdminAction {
    STATUS(true),
    UNLOAD,
    RELOAD,
    CREATE,
    SWAP,
    RENAME,
    MERGEINDEXES,
    SPLIT,
    PREPRECOVERY,
    REQUESTRECOVERY,
    REQUESTSYNCSHARD,
    DELETEALIAS,
    REQUESTBUFFERUPDATES,
    REQUESTAPPLYUPDATES,
    OVERSEEROP,
    REQUESTSTATUS(true),
    REJOINLEADERELECTION,
    //internal API used by force shard leader election
    FORCEPREPAREFORLEADERSHIP,
    INVOKE,
    //Internal APIs to backup and restore a core
    BACKUPCORE,
    RESTORECORE,
    CREATESNAPSHOT,
    DELETESNAPSHOT,
    LISTSNAPSHOTS;

    public final boolean isRead;

    CoreAdminAction(boolean isRead) {
      this.isRead = isRead;
    }

    CoreAdminAction() {
      this.isRead = false;
    }

    public static CoreAdminAction get( String p ) {
      if (p != null) {
        try {
          return CoreAdminAction.valueOf(p.toUpperCase(Locale.ROOT));
        } catch (IllegalArgumentException e) {
          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Wrong core admin action");
        }
      }
      return null; 
    }
  }
}
