package com.criteo.gerrit.plugins.automerge;

import com.google.common.base.Charsets;
import com.google.common.io.Files;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.change.PostReview;
import com.google.gerrit.server.change.RevisionResource;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;

public class ReviewUpdater {
  private final static Logger log = LoggerFactory.getLogger(AutomaticMerger.class);

  @Inject
  ChangeData.Factory changeDataFactory;

  @Inject
  AutomergeConfig config;

  @Inject
  Provider<ReviewDb> db;

  @Inject
  Provider<PostReview> reviewer;

  @Inject
  private AtomicityHelper atomicityHelper;

  public void commentOnReview(final int number, final String commentTemplate) throws RestApiException, OrmException, IOException, NoSuchChangeException {
    final ReviewInput comment = createComment(commentTemplate);
    applyComment(number, comment);
  }

  public void setMinusOne(final int number, final String commentTemplate) throws RestApiException, OrmException, IOException, NoSuchChangeException {
    final ReviewInput message = createComment(commentTemplate).label("Code-Review", -1);
    applyComment(number, message);
  }

  private ReviewInput createComment(final String commentTemplate) {
    return new ReviewInput().message(getCommentFromFile(commentTemplate));
  }

  private String getCommentFromFile(final String filename) {
     try {
       return Files.toString(new File(config.getTemplatesPath(), filename), Charsets.UTF_8);
     } catch (final IOException exc) {
       final String errmsg =
           String.format("Cannot find %s file in gerrit etc dir. Please check your gerrit configuration", filename);
       log.error(errmsg);
       return errmsg;
     }
   }

  private void applyComment(final int number, ReviewInput comment) throws RestApiException, OrmException, IOException, NoSuchChangeException {
    final RevisionResource r = atomicityHelper.getRevisionResource(number);
    reviewer.get().apply(r, comment);
  }
}
