/*
 * 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.reviewdb.client.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;
  }
}
