// Copyright (C) 2020 The Android Open Source Project
//
// Licensed 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 com.gerritforge.gerrit.globalrefdb.validation;

import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;

/**
 * A convenience object encompassing the old (current) and the new (candidate) value of a {@link
 * Ref}. This is used to snapshot the current status of a ref update so that validations against the
 * global refdb are unaffected by changes on the underlying {@link
 * org.eclipse.jgit.lib.RefDatabase}.
 */
class RefUpdateSnapshot {
  private final Ref ref;
  private final ObjectId newValue;
  private final Exception exception;

  /**
   * Constructs a {@code RefUpdateSnapshot} with the provided old and new values. The old value of
   * this Ref must not be null, otherwise an {@link IllegalArgumentException} is thrown.
   *
   * @param ref the ref with its old value
   * @param newRefValue the new (candidate) value for this ref.
   */
  RefUpdateSnapshot(Ref ref, ObjectId newRefValue) {
    if (ref == null) {
      throw new IllegalArgumentException("RefUpdateSnapshot cannot be created for null Ref");
    }
    this.ref = ref;
    this.newValue = newRefValue;
    this.exception = null;
  }

  /**
   * Constructs a {@code RefUpdateSnapshot} with the current ref and an Exception indicating why the
   * ref's new value could not be retrieved.
   *
   * @param ref the ref with its old value
   * @param e exception caught when trying to retrieve the ref's new value
   */
  RefUpdateSnapshot(Ref ref, Exception e) {
    this.ref = ref;
    this.newValue = ObjectId.zeroId();
    this.exception = e;
  }

  /**
   * Get the ref name
   *
   * @return the ref name
   */
  public String getName() {
    return ref.getName();
  }

  /**
   * Get the ref's old value
   *
   * @return the ref's old value
   */
  public ObjectId getOldValue() {
    return ref.getObjectId();
  }

  /**
   * Get the ref's new (candidate) value
   *
   * @return the ref's new (candidate) value
   */
  public ObjectId getNewValue() {
    return newValue;
  }

  /**
   * Get the snapshotted ref with its old value
   *
   * @return the snapshotted ref with its old value
   */
  public Ref getRef() {
    return ref;
  }

  /**
   * Get the exception which occurred when retrieving the ref's new value
   *
   * @return the exception which occurred when retrieving the ref's new value
   */
  public Exception getException() {
    return exception;
  }

  /**
   * Whether retrieving the new (candidate) value failed
   *
   * @return {@code true} when retrieving the ref's new (candidate) value failed, {@code false}
   *     otherwise.
   */
  public boolean hasFailed() {
    return exception != null;
  }
}
