/*
 * Copyright (c) 2013 VMware, Inc. All Rights Reserved.
 */
package com.vmware.gerrit.owners.common;

import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.change.ChangeResource;
import com.google.gerrit.server.change.PostReviewers;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gwtorm.server.OrmException;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import java.io.IOException;
import java.util.Collection;

@Singleton
public class ReviewerManager {

  private final Provider<CurrentUser> currentUserProvider;

  private final Provider<PostReviewers> postReviewersProvider;

  private final ChangeControl.GenericFactory changeControlFactory;

  @Inject
  public ReviewerManager(Provider<CurrentUser> currentUserProvider,
                         Provider<PostReviewers> postReviewersProvider,
                         ChangeControl.GenericFactory changeControlFactory) {
    this.currentUserProvider = currentUserProvider;
    this.postReviewersProvider = postReviewersProvider;
    this.changeControlFactory = changeControlFactory;
  }

  public void addReviewers(Change change, Collection<Account.Id> reviewers) throws ReviewerManagerException {
    try {
      PostReviewers postReviewers = postReviewersProvider.get();
      ChangeControl changeControl = changeControlFactory.controlFor(change, currentUserProvider.get());
      ChangeResource changeResource = new ChangeResource(changeControl);

      // HACK(vspivak): Using PostReviewers is probably inefficient here, however it has all the hook/notification
      // logic, so it's easier to call it then to mimic/copy the logic here.
      for (Account.Id accountId : reviewers) {
        PostReviewers.Input input = new PostReviewers.Input();
        input.reviewer = accountId.toString();
        postReviewers.apply(changeResource, input);
      }
    } catch (RestApiException e) {
      throw new ReviewerManagerException(e);
    } catch (NoSuchChangeException e) {
      throw new ReviewerManagerException(e);
    } catch (EmailException e) {
      throw new ReviewerManagerException(e);
    } catch (OrmException e) {
      throw new ReviewerManagerException(e);
    } catch (IOException e) {
      throw new ReviewerManagerException(e);
    }
  }
}
