// Copyright (C) 2023 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.googlesource.gerrit.plugins.spannerrefdb;

import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.RefNames;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectIdRef;
import org.eclipse.jgit.lib.Ref;
import org.junit.Ignore;

@Ignore
public interface RefFixture {
  static final String PROJECT_NAME = "A_TEST_PROJECT_NAME";
  static final Project.NameKey PROJECT_NAME_KEY = Project.nameKey(PROJECT_NAME);
  static final ObjectId OBJECT_ID_1 = new ObjectId(1, 2, 3, 4, 5);
  static final ObjectId OBJECT_ID_2 = new ObjectId(1, 2, 3, 4, 6);
  static final ObjectId OBJECT_ID_3 = new ObjectId(1, 2, 3, 4, 7);
  static final Long UNIX_TIMESTAMP_1 = 1690379900L;
  static final Long UNIX_TIMESTAMP_2 = 1690815810L;
  static final String REF_NAME = "refs/heads/master";
  static final String PATCHSET_REF_NAME = "refs/changes/01/1/1";
  static final String MULTISITE_VERSION_VALUE_REF_NAME = "refs/multi-site/version/value";

  default String aBranchRef() {
    return RefNames.REFS_HEADS + testBranch();
  }

  default String testBranch() {
    return "foo";
  }

  default Ref newRef(String refName, ObjectId objectId) {
    return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
  }

  default Ref nullRef(String refName) {
    return newRef(refName, ObjectId.zeroId());
  }
}
