// 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.google.gerrit.acceptance.testsuite.change;

import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.base.Strings;
import com.google.gerrit.common.RawInputUtil;
import com.google.gerrit.server.edit.tree.ChangeFileContentModification;
import com.google.gerrit.server.edit.tree.DeleteFileModification;
import com.google.gerrit.server.edit.tree.RenameFileModification;
import com.google.gerrit.server.edit.tree.TreeModification;
import java.util.function.Consumer;

/** Builder to simplify file content specification. */
public class FileContentBuilder<T> {
  private final T builder;
  private final String filePath;
  private final int newGitFileMode;
  private final Consumer<TreeModification> modificationToBuilderAdder;

  FileContentBuilder(
      T builder,
      String filePath,
      int newGitFileMode,
      Consumer<TreeModification> modificationToBuilderAdder) {
    checkNotNull(Strings.emptyToNull(filePath), "File path must not be null or empty.");
    this.builder = builder;
    this.filePath = filePath;
    this.newGitFileMode = newGitFileMode;
    this.modificationToBuilderAdder = modificationToBuilderAdder;
  }

  /** Content of the file. Must not be empty. */
  public T content(String content) {
    checkNotNull(
        Strings.emptyToNull(content),
        "Empty file content is not supported. Adjust test API if necessary.");
    modificationToBuilderAdder.accept(
        new ChangeFileContentModification(filePath, RawInputUtil.create(content), newGitFileMode));
    return builder;
  }

  /** Deletes the file. */
  public T delete() {
    modificationToBuilderAdder.accept(new DeleteFileModification(filePath));
    return builder;
  }

  /**
   * Renames the file while keeping its content.
   *
   * <p>If you want to both rename the file and adjust its content, delete the old path via {@link
   * #delete()} and provide the desired content for the new path via {@link #content(String)}. If
   * you use that approach, make sure to use a new content which is similar enough to the old (at
   * least 60% line similarity) as otherwise Gerrit/Git won't identify it as a rename.
   *
   * <p>To create copied files, you need to go even one step further. Also rename the file you copy
   * at the same time (-> delete old path + add two paths with the old content)! If you also want to
   * adjust the content of the copy, you need to also slightly modify the content of the renamed
   * file. Adjust the content of the copy slightly more if you want to control which file ends up as
   * copy and which as rename (but keep the 60% line similarity threshold in mind).
   *
   * @param newFilePath new path of the file
   */
  public T renameTo(String newFilePath) {
    modificationToBuilderAdder.accept(new RenameFileModification(filePath, newFilePath));
    return builder;
  }
}
