/*
 * Copyright 2017 Cisco Systems, Inc.
 *
 * 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.cisco.gerrit.plugins.slack.config;

import com.google.gerrit.entities.Project;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.gerrit.server.project.NoSuchProjectException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A simple configuration class to access plugin config values.
 *
 * @author Matthew Montgomery
 */
public class ProjectConfig {
  /** The name of the plugin config section to lookup within the gerrit.config file. */
  public static final String CONFIG_NAME = "slack-integration";

  /** The class logger instance. */
  private static final Logger LOGGER = LoggerFactory.getLogger(ProjectConfig.class);

  private boolean enabled;
  private String webhookUrl;
  private String channel;
  private String username;
  private String ignore;
  private boolean ignoreUnchangedPatchSet;
  private boolean ignoreWorkInProgressPatchSet;
  private boolean ignorePrivatePatchSet;
  private String ignoreCommentAuthor;
  private boolean publishOnPatchSetCreated;
  private boolean publishOnChangeMerged;
  private boolean publishOnCommentAdded;
  private boolean publishOnReviewerAdded;
  private boolean publishOnWipReady;
  private boolean publishOnPrivateToPublic;

  private String proxyHost;
  private int proxyPort;
  private String proxyUsername;
  private String proxyPassword;

  /**
   * Creates a new instance of the ProjectConfig class for the given project.
   *
   * @param configFactory The Gerrit PluginConfigFactory instance to use.
   * @param project The project to use when looking up a configuration.
   */
  public ProjectConfig(PluginConfigFactory configFactory, String project) {
    enabled = false;

    Project.NameKey projectNameKey;
    projectNameKey = Project.NameKey.parse(project);

    try {
      enabled =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("enabled", false);

      webhookUrl =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getString("webhookurl", "");

      channel =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getString("channel", "general");

      username =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getString("username", "gerrit");

      ignore =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getString("ignore", "");

      ignoreUnchangedPatchSet =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("ignore-unchanged-patch-set", true);

      ignoreWorkInProgressPatchSet =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("ignore-wip-patch-set", true);

      ignorePrivatePatchSet =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("ignore-private-patch-set", true);

      ignoreCommentAuthor =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getString("ignore-comment-author", "");

      publishOnPatchSetCreated =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("publish-on-patch-set-created", true);

      publishOnChangeMerged =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("publish-on-change-merged", true);

      publishOnCommentAdded =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("publish-on-comment-added", true);

      publishOnReviewerAdded =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("publish-on-reviewer-added", true);

      publishOnWipReady =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("publish-on-wip-ready", publishOnPatchSetCreated);

      publishOnPrivateToPublic =
          configFactory
              .getFromProjectConfigWithInheritance(projectNameKey, CONFIG_NAME)
              .getBoolean("publish-on-private-to-public", publishOnPatchSetCreated);

      proxyHost = configFactory.getFromGerritConfig(CONFIG_NAME).getString("proxy-host", null);

      proxyPort = configFactory.getFromGerritConfig(CONFIG_NAME).getInt("proxy-port", 8080);

      proxyUsername =
          configFactory.getFromGerritConfig(CONFIG_NAME).getString("proxy-username", null);

      proxyPassword =
          configFactory.getFromGerritConfig(CONFIG_NAME).getString("proxy-password", null);
    } catch (NoSuchProjectException e) {
      LOGGER.warn("The specified project could not be found: " + project);
    }
  }

  public boolean isEnabled() {
    return enabled;
  }

  public String getWebhookUrl() {
    return webhookUrl;
  }

  public String getChannel() {
    return channel;
  }

  public String getUsername() {
    return username;
  }

  public String getIgnore() {
    return ignore;
  }

  public boolean getIgnoreUnchangedPatchSet() {
    return ignoreUnchangedPatchSet;
  }

  public boolean getIgnoreWorkInProgressPatchSet() {
    return ignoreWorkInProgressPatchSet;
  }

  public boolean getIgnorePrivatePatchSet() {
    return ignorePrivatePatchSet;
  }

  public String getIgnoreCommentAuthor() {
    return ignoreCommentAuthor;
  }

  public boolean shouldPublishOnPatchSetCreated() {
    return publishOnPatchSetCreated;
  }

  public boolean shouldPublishOnChangeMerged() {
    return publishOnChangeMerged;
  }

  public boolean shouldPublishOnCommentAdded() {
    return publishOnCommentAdded;
  }

  public boolean shouldPublishOnReviewerAdded() {
    return publishOnReviewerAdded;
  }

  public boolean shouldPublishOnWipReady() {
    return publishOnWipReady;
  }

  public boolean shouldPublishOnPrivateToPublic() {
    return publishOnPrivateToPublic;
  }

  public String getProxyHost() {
    return proxyHost;
  }

  public int getProxyPort() {
    return proxyPort;
  }

  public String getProxyUsername() {
    return proxyUsername;
  }

  public String getProxyPassword() {
    return proxyPassword;
  }
}
