// Copyright (C) 2019 GerritForge Ltd
//
// 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;

import com.google.gerrit.entities.Project;
import java.util.Optional;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;

public interface GlobalRefDatabase {

  /**
   * Check in global ref-db if ref is up-to-date
   *
   * @param project project name of the ref
   * @param ref to be checked against global ref-db
   * @return true if it is; false otherwise
   * @throws GlobalRefDbLockException implementation must handle operation atomicity if there was a
   *     problem with locking ref in the ref db exception will be thrown
   */
  boolean isUpToDate(Project.NameKey project, Ref ref) throws GlobalRefDbLockException;

  /**
   * Compare a reference, and put if it is up-to-date with the current.
   *
   * <p>Two reference match if and only if they satisfy the following:
   *
   * <ul>
   *   <li>If one reference is a symbolic ref, the other one should be a symbolic ref.
   *   <li>If both are symbolic refs, the target names should be same.
   *   <li>If both are object ID refs, the object IDs should be same.
   * </ul>
   *
   * Compare and put are executed as an atomic operation.
   *
   * @param project project name of the ref
   * @param currRef old value to compare to. If the reference is expected to not exist the old value
   *     has a storage of {@link org.eclipse.jgit.lib.Ref.Storage#NEW} and an ObjectId value of
   *     {@code null}.
   * @param newRefValue new reference to store.
   * @return true if the put was successful; false otherwise.
   * @throws GlobalRefDbSystemError the reference cannot be put due to a system error.
   */
  boolean compareAndPut(Project.NameKey project, Ref currRef, ObjectId newRefValue)
      throws GlobalRefDbSystemError;

  /**
   * Compare a value of generic type T, and put if it is up-to-date with the current.
   *
   * <p>Compare and put are executed as an atomic operation.
   *
   * @param project project name of the ref.
   * @param refName to store the value for.
   * @param currValue current expected value in the DB.
   * @param newValue new value to store.
   * @return true if the put was successful; false otherwise.
   * @throws GlobalRefDbSystemError the reference cannot be put due to a system error.
   */
  <T> boolean compareAndPut(Project.NameKey project, String refName, T currValue, T newValue)
      throws GlobalRefDbSystemError;

  /**
   * Lock a reference.
   *
   * @param project project name
   * @param refName ref to lock
   * @return lock object
   * @throws GlobalRefDbLockException if the lock cannot be obtained
   */
  AutoCloseable lockRef(Project.NameKey project, String refName) throws GlobalRefDbLockException;

  /**
   * Verify if the DB contains a value for the specific project and ref name
   *
   * @param project
   * @param refName
   * @return true if the ref exists on the project
   */
  boolean exists(Project.NameKey project, String refName);

  /**
   * Clean project path from global-ref db
   *
   * @param project project name
   * @throws GlobalRefDbSystemError project cannot be removed due to a system error.
   */
  void remove(Project.NameKey project) throws GlobalRefDbSystemError;

  /**
   * Return value for a specific project and ref name
   *
   * @param project project name
   * @param refName reference name
   * @return {@link java.util.Optional} of the value
   * @throws GlobalRefDbSystemError value cannot be returned due to a system error.
   */
  <T> Optional<T> get(Project.NameKey project, String refName) throws GlobalRefDbSystemError;
}
