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