// 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.plugins.codeowners.backend;

import static com.google.gerrit.plugins.codeowners.backend.CodeOwnersInternalServerErrorException.newInternalServerError;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Objects.requireNonNull;

import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.BranchNameKey;
import com.google.gerrit.git.RefUpdateUtil;
import com.google.gerrit.plugins.codeowners.backend.config.CodeOwnersPluginConfiguration;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
import java.util.Optional;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor;
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;

/**
 * Class to scan a branch for code owner config files and update them.
 *
 * <p>Doesn't parse the code owner config files but provides the raw content to the callback.
 *
 * <p>All updates to the code owner config files are done atomically with a single commit.
 */
@Singleton
public class CodeOwnerConfigFileUpdateScanner {
  private static final FluentLogger logger = FluentLogger.forEnclosingClass();

  private final GitRepositoryManager repoManager;
  private final CodeOwnersPluginConfiguration codeOwnersPluginConfiguration;
  private final Provider<PersonIdent> serverIdentProvider;
  private final Provider<IdentifiedUser> identifiedUser;

  @Inject
  CodeOwnerConfigFileUpdateScanner(
      GitRepositoryManager repoManager,
      CodeOwnersPluginConfiguration codeOwnersPluginConfiguration,
      @GerritPersonIdent Provider<PersonIdent> serverIdentProvider,
      Provider<IdentifiedUser> identifiedUser) {
    this.repoManager = repoManager;
    this.codeOwnersPluginConfiguration = codeOwnersPluginConfiguration;
    this.serverIdentProvider = serverIdentProvider;
    this.identifiedUser = identifiedUser;
  }

  /**
   * Visits and updates all code owner config files in the given project and branch.
   *
   * <p>All updates are done in a single commit. If none of the code owner config files is updated,
   * no new commit is created.
   *
   * @param branchNameKey the project and branch for which the code owner config files should be
   *     updated
   * @param commitMessage commit message for the new commit if an update is performed
   * @param codeOwnerConfigFileUpdater the callback that is invoked for each code owner config file
   * @return the commit that renamed the email if any update was performed
   */
  public Optional<RevCommit> update(
      BranchNameKey branchNameKey,
      String commitMessage,
      CodeOwnerConfigFileUpdater codeOwnerConfigFileUpdater) {
    requireNonNull(branchNameKey, "branchNameKey");
    requireNonNull(commitMessage, "commitMessage");
    requireNonNull(codeOwnerConfigFileUpdater, "codeOwnerConfigFileUpdater");

    CodeOwnerBackend codeOwnerBackend =
        codeOwnersPluginConfiguration
            .getProjectConfig(branchNameKey.project())
            .getBackend(branchNameKey.branch());
    logger.atFine().log(
        "updating code owner files in branch %s of project %s",
        branchNameKey.branch(), branchNameKey.project());

    try (Repository repository = repoManager.openRepository(branchNameKey.project());
        RevWalk rw = new RevWalk(repository);
        ObjectInserter oi = repository.newObjectInserter();
        CodeOwnerConfigTreeWalk treeWalk =
            new CodeOwnerConfigTreeWalk(
                codeOwnerBackend,
                branchNameKey,
                repository,
                rw,
                /** pathGlob */
                null)) {
      RevCommit revision = treeWalk.getRevision();
      DirCache newTree = DirCache.read(rw.getObjectReader(), revision.getTree());
      DirCacheEditor editor = newTree.editor();

      boolean dirty = false;
      while (treeWalk.next()) {
        Optional<String> updatedContent =
            codeOwnerConfigFileUpdater.update(treeWalk.getFilePath(), treeWalk.getFileContent());
        if (updatedContent.isPresent()) {
          dirty = true;

          // insert blob with new file content
          ObjectId blobId = oi.insert(Constants.OBJ_BLOB, updatedContent.get().getBytes(UTF_8));

          // append edit command to set the new blob for the code owner config file
          editor.add(createEditCommand(treeWalk.getPathString(), blobId));
        }
      }

      if (!dirty) {
        return Optional.empty();
      }

      editor.finish();
      ObjectId treeId = newTree.writeTree(oi);
      ObjectId commitId = createCommit(oi, commitMessage, revision, treeId);
      updateBranch(branchNameKey.branch(), repository, revision, commitId);
      return Optional.of(rw.parseCommit(commitId));
    } catch (IOException e) {
      throw newInternalServerError(
          String.format(
              "Failed to scan for code owner configs in branch %s of project %s",
              branchNameKey.branch(), branchNameKey.project()),
          e);
    }
  }

  /**
   * Creates an edit command that sets the given blob for the given path
   *
   * @param jgitFilePath path of the file for which the blob should be set, as jgit path (not
   *     starting with '/')
   * @param blobId the ID of the blob that should be set for the file path
   * @return the edit command
   */
  private PathEdit createEditCommand(String jgitFilePath, ObjectId blobId) {
    return new PathEdit(jgitFilePath) {
      @Override
      public void apply(DirCacheEntry entry) {
        entry.setFileMode(FileMode.REGULAR_FILE);
        entry.setObjectId(blobId);
      }
    };
  }

  /**
   * Creates a new commit.
   *
   * @param objectInserter object inserter that should be used to insert the new commit
   * @param commitMessage the commit message that should be used for the new commit
   * @param parentCommit the commit that should be set as parent commit of the new commit
   * @param treeId the tree of the new commit
   * @return the commit ID
   */
  private ObjectId createCommit(
      ObjectInserter objectInserter, String commitMessage, ObjectId parentCommit, ObjectId treeId)
      throws IOException {
    PersonIdent serverIdent = serverIdentProvider.get();
    CommitBuilder cb = new CommitBuilder();
    cb.setParentId(parentCommit);
    cb.setTreeId(treeId);
    cb.setCommitter(serverIdent);
    cb.setAuthor(identifiedUser.get().newCommitterIdent(serverIdent));
    cb.setMessage(commitMessage);
    ObjectId id = objectInserter.insert(cb);
    objectInserter.flush();
    return id;
  }

  /**
   * Update the given branch.
   *
   * @param branchName the name of the branch that should be updated
   * @param repository the repository in which the branch should be updated
   * @param oldObjectId the expected old object ID of the branch
   * @param newObjectId the new object ID that should be set for the branch
   */
  private void updateBranch(
      String branchName, Repository repository, ObjectId oldObjectId, ObjectId newObjectId)
      throws IOException {
    RefUpdate ru = repository.updateRef(branchName);
    ru.setExpectedOldObjectId(oldObjectId);
    ru.setNewObjectId(newObjectId);
    ru.update();
    RefUpdateUtil.checkResult(ru);
  }
}
