// Copyright (C) 2012 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.sshd.commands;

import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER;

import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.gerrit.extensions.api.projects.BanCommitInput;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.restapi.project.BanCommit;
import com.google.gerrit.server.restapi.project.BanCommit.BanResultInfo;
import com.google.gerrit.sshd.CommandMetaData;
import com.google.gerrit.sshd.SshCommand;
import com.google.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jgit.lib.ObjectId;
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.Option;

@CommandMetaData(
    name = "ban-commit",
    description = "Ban a commit from a project's repository",
    runsAt = MASTER)
public class BanCommitCommand extends SshCommand {
  @Option(
      name = "--reason",
      aliases = {"-r"},
      metaVar = "REASON",
      usage = "reason for banning the commit")
  private String reason;

  @Argument(
      index = 0,
      required = true,
      metaVar = "PROJECT",
      usage = "name of the project for which the commit should be banned")
  private ProjectState projectState;

  @Argument(
      index = 1,
      required = true,
      multiValued = true,
      metaVar = "COMMIT",
      usage = "commit(s) that should be banned")
  private List<ObjectId> commitsToBan = new ArrayList<>();

  @Inject private BanCommit banCommit;

  @Override
  protected void run() throws Failure {
    try {
      BanCommitInput input =
          BanCommitInput.fromCommits(Lists.transform(commitsToBan, ObjectId::getName));
      input.reason = reason;

      BanResultInfo r = banCommit.apply(new ProjectResource(projectState, user), input);
      printCommits(r.newlyBanned, "The following commits were banned");
      printCommits(r.alreadyBanned, "The following commits were already banned");
      printCommits(r.ignored, "The following ids do not represent commits and were ignored");
    } catch (Exception e) {
      throw die(e);
    }
  }

  private void printCommits(List<String> commits, String message) {
    if (commits != null && !commits.isEmpty()) {
      stdout.print(message + ":\n");
      stdout.print(Joiner.on(",\n").join(commits));
      stdout.print("\n\n");
    }
  }
}
