/*
 * 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.hadoop.fs.ozone;

import java.util.HashMap;
import java.util.Map;
import org.apache.hadoop.fs.StorageStatistics.CommonStatisticNames;

/**
 * Statistic which are collected in OzoneFileSystem.
 * These statistics are available at a low level in
 * {@link OzoneFSStorageStatistics}
 */
public enum Statistic {
  OBJECTS_RENAMED("objects_renamed",
      "Total number of objects renamed within the object store."),
  OBJECTS_CREATED("objects_created",
      "Total number of objects created through the object store."),
  OBJECTS_DELETED("objects_deleted",
      "Total number of objects deleted from the object store."),
  OBJECTS_READ("objects_read",
      "Total number of objects read from the object store."),
  OBJECTS_QUERY("objects_query",
      "Total number of objects queried from the object store."),
  OBJECTS_LIST("objects_list",
      "Total number of object list query from the object store."),
  INVOCATION_COPY_FROM_LOCAL_FILE(CommonStatisticNames.OP_COPY_FROM_LOCAL_FILE,
      "Calls of copyFromLocalFile()"),
  INVOCATION_CREATE(CommonStatisticNames.OP_CREATE,
      "Calls of create()"),
  INVOCATION_CREATE_NON_RECURSIVE(CommonStatisticNames.OP_CREATE_NON_RECURSIVE,
      "Calls of createNonRecursive()"),
  INVOCATION_DELETE(CommonStatisticNames.OP_DELETE,
      "Calls of delete()"),
  INVOCATION_EXISTS(CommonStatisticNames.OP_EXISTS,
      "Calls of exists()"),
  INVOCATION_GET_FILE_CHECKSUM(CommonStatisticNames.OP_GET_FILE_CHECKSUM,
      "Calls of getFileChecksum()"),
  INVOCATION_GET_FILE_STATUS(CommonStatisticNames.OP_GET_FILE_STATUS,
      "Calls of getFileStatus()"),
  INVOCATION_GLOB_STATUS(CommonStatisticNames.OP_GLOB_STATUS,
      "Calls of globStatus()"),
  INVOCATION_IS_DIRECTORY(CommonStatisticNames.OP_IS_DIRECTORY,
      "Calls of isDirectory()"),
  INVOCATION_IS_FILE(CommonStatisticNames.OP_IS_FILE,
      "Calls of isFile()"),
  INVOCATION_LIST_FILES(CommonStatisticNames.OP_LIST_FILES,
      "Calls of listFiles()"),
  INVOCATION_LIST_LOCATED_STATUS(CommonStatisticNames.OP_LIST_LOCATED_STATUS,
      "Calls of listLocatedStatus()"),
  INVOCATION_LIST_STATUS(CommonStatisticNames.OP_LIST_STATUS,
      "Calls of listStatus()"),
  INVOCATION_MKDIRS(CommonStatisticNames.OP_MKDIRS,
      "Calls of mkdirs()"),
  INVOCATION_OPEN(CommonStatisticNames.OP_OPEN,
      "Calls of open()"),
  INVOCATION_RENAME(CommonStatisticNames.OP_RENAME,
      "Calls of rename()"),
  INVOCATION_SET_TIMES(CommonStatisticNames.OP_SET_TIMES,
      "Calls of setTimes()"),
  INVOCATION_IS_FILE_CLOSED("op_is_file_closed",
      "Calls of isFileClosed()"),
  INVOCATION_RECOVER_FILE_PREPARE("op_recover_file_prepare",
      "Calls of recoverFilePrepare()"),
  INVOCATION_RECOVER_FILE("op_recover_file", "Calls of recoverFile()"),
  INVOCATION_FINALIZE_BLOCK("op_finalize_block", "Calls of finalizeBlock()"),
  INVOCATION_SET_SAFE_MODE("op_set_safe_mode",
      "Calls of setSafeMode()");

  private static final Map<String, Statistic> SYMBOL_MAP =
      new HashMap<>(Statistic.values().length);
  static {
    for (Statistic stat : values()) {
      SYMBOL_MAP.put(stat.getSymbol(), stat);
    }
  }

  private final String symbol;
  private final String description;

  Statistic(String symbol, String description) {
    this.symbol = symbol;
    this.description = description;
  }

  public String getSymbol() {
    return symbol;
  }

  /**
   * Get a statistic from a symbol.
   * @param symbol statistic to look up
   * @return the value or null.
   */
  public static Statistic fromSymbol(String symbol) {
    return SYMBOL_MAP.get(symbol);
  }

  public String getDescription() {
    return description;
  }

  /**
   * The string value is simply the symbol.
   * This makes this operation very low cost.
   * @return the symbol of this statistic.
   */
  @Override
  public String toString() {
    return symbol;
  }
}
