package org.jenkinsci.plugins.jvctg;

import static hudson.tasks.BuildStepMonitor.NONE;
import static org.jenkinsci.plugins.jvctg.perform.JvctgPerformer.jvctsPerform;

import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Publisher;
import hudson.tasks.Recorder;
import java.io.IOException;
import jenkins.tasks.SimpleBuildStep;
import org.jenkinsci.plugins.jvctg.config.ViolationsToGitHubConfig;
import org.kohsuke.stapler.DataBoundConstructor;

public class ViolationsToGitHubRecorder extends Recorder implements SimpleBuildStep {

  public static final BuildStepDescriptor<Publisher> DESCRIPTOR =
      new ViolationsToGitHubDescriptor();

  private ViolationsToGitHubConfig config;

  public ViolationsToGitHubRecorder() {}

  @DataBoundConstructor
  public ViolationsToGitHubRecorder(final ViolationsToGitHubConfig config) {
    this.config = config;
  }

  public ViolationsToGitHubConfig getConfig() {
    return this.config;
  }

  @Override
  public BuildStepDescriptor<Publisher> getDescriptor() {
    return DESCRIPTOR;
  }

  @Override
  public BuildStepMonitor getRequiredMonitorService() {
    return NONE;
  }

  @Override
  public void perform(
      @NonNull final Run<?, ?> build,
      @NonNull final FilePath filePath,
      @NonNull final Launcher launcher,
      @NonNull final TaskListener listener)
      throws InterruptedException, IOException {

    final ViolationsToGitHubConfig combinedConfig = new ViolationsToGitHubConfig(this.config);
    final ViolationsToGitHubConfiguration defaults = ViolationsToGitHubConfiguration.get();

    combinedConfig.applyDefaults(defaults);

    jvctsPerform(combinedConfig, filePath, build, listener);
  }

  public void setConfig(final ViolationsToGitHubConfig config) {
    this.config = config;
  }
}