// Copyright (C) 2010 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.httpd.rpc.patch;

import com.google.gerrit.common.data.ReviewerResult;
import com.google.gerrit.httpd.rpc.Handler;
import com.google.gerrit.httpd.rpc.changedetail.ChangeDetailFactory;
import com.google.gerrit.reviewdb.Account;
import com.google.gerrit.reviewdb.Change;
import com.google.gerrit.reviewdb.PatchSetApproval;
import com.google.gerrit.reviewdb.ReviewDb;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gwtorm.client.OrmException;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;

import java.util.ArrayList;
import java.util.List;

/**
 * Implement the remote logic that removes a reviewer from a change.
 */
class RemoveReviewer extends Handler<ReviewerResult> {
  interface Factory {
    RemoveReviewer create(Change.Id changeId, Account.Id reviewerId);
  }

  private final Account.Id reviewerId;
  private final ChangeControl.Factory changeControlFactory;
  private final ReviewDb db;
  private final Change.Id changeId;
  private final ChangeDetailFactory.Factory changeDetailFactory;

  @Inject
  RemoveReviewer(final ReviewDb db, final ChangeControl.Factory changeControlFactory,
      final ChangeDetailFactory.Factory changeDetailFactory,
      @Assisted Change.Id changeId, @Assisted Account.Id reviewerId) {
    this.db = db;
    this.changeControlFactory = changeControlFactory;
    this.changeId = changeId;
    this.reviewerId = reviewerId;
    this.changeDetailFactory = changeDetailFactory;
  }

  @Override
  public ReviewerResult call() throws Exception {
    ReviewerResult result = new ReviewerResult();
    List<Account.Id> accounts = new ArrayList<Account.Id>();
    ChangeControl ctl = changeControlFactory.validateFor(changeId);
    boolean permitted = true;

    List<PatchSetApproval> toDelete = new ArrayList<PatchSetApproval>();
    for (PatchSetApproval psa : db.patchSetApprovals().byChange(changeId)) {
      if (psa.getAccountId().equals(reviewerId)) {
        if (ctl.canRemoveReviewer(psa)) {
          toDelete.add(psa);
        } else {
          permitted = false;
          break;
        }
      }
    }

    if (permitted) {
      try {
        db.patchSetApprovals().delete(toDelete);
      } catch (OrmException ex) {
        result.addError(new ReviewerResult.Error(
            ReviewerResult.Error.Type.COULD_NOT_REMOVE,
            "Could not remove reviewer " + reviewerId));
      }
    } else {
      result.addError(new ReviewerResult.Error(
          ReviewerResult.Error.Type.COULD_NOT_REMOVE,
          "Not allowed to remove reviewer " + reviewerId));
    }

    // Note: call setChange() after the deletion has been made or it will still
    // contain the reviewer we want to delete.
    result.setChange(changeDetailFactory.create(changeId).call());
    return result;
  }

}
