// Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
//  This source code is licensed under both the GPLv2 (found in the
//  COPYING file in the root directory) and Apache 2.0 License
//  (found in the LICENSE.Apache file in the root directory).

package org.rocksdb;

import java.util.Objects;

public class WriteStallInfo {
  private final String columnFamilyName;
  private final WriteStallCondition currentCondition;
  private final WriteStallCondition previousCondition;

  /**
   * Access is package private as this will only be constructed from
   * C++ via JNI and for testing.
   */
  WriteStallInfo(final String columnFamilyName, final byte currentConditionValue,
      final byte previousConditionValue) {
    this.columnFamilyName = columnFamilyName;
    this.currentCondition = WriteStallCondition.fromValue(currentConditionValue);
    this.previousCondition = WriteStallCondition.fromValue(previousConditionValue);
  }

  /**
   * Get the name of the column family.
   *
   * @return the name of the column family.
   */
  public String getColumnFamilyName() {
    return columnFamilyName;
  }

  /**
   * Get the current state of the write controller.
   *
   * @return the current state.
   */
  public WriteStallCondition getCurrentCondition() {
    return currentCondition;
  }

  /**
   * Get the previous state of the write controller.
   *
   * @return the previous state.
   */
  public WriteStallCondition getPreviousCondition() {
    return previousCondition;
  }

  @Override
  public boolean equals(final Object o) {
    if (this == o)
      return true;
    if (o == null || getClass() != o.getClass())
      return false;
    final WriteStallInfo that = (WriteStallInfo) o;
    return Objects.equals(columnFamilyName, that.columnFamilyName)
        && currentCondition == that.currentCondition && previousCondition == that.previousCondition;
  }

  @Override
  public int hashCode() {
    return Objects.hash(columnFamilyName, currentCondition, previousCondition);
  }

  @Override
  public String toString() {
    return "WriteStallInfo{"
        + "columnFamilyName='" + columnFamilyName + '\'' + ", currentCondition=" + currentCondition
        + ", previousCondition=" + previousCondition + '}';
  }
}
