// Copyright (C) 2015 The Android Open Source Project
//
// 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.googlesource.gerrit.plugins.saml;

import com.google.gerrit.server.config.GerritServerConfig;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.jgit.lib.Config;

/** SAML 2.0 related settings from {@code gerrit.config}. */
@Singleton
public class SamlConfig {
  private static final String SAML_SECTION = "saml";

  private final String serviceProviderEntityId;
  private final String metadataPath;
  private final String keystorePath;
  private final String privateKeyPassword;
  private final String keystorePassword;
  private final String displayNameAttr;
  private final String userNameAttr;
  private final String emailAddressAttr;
  private final int maxAuthLifetimeAttr;
  private final boolean computedDisplayName;
  private final String firstNameAttr;
  private final String lastNameAttr;
  private final int maxAuthLifetimeDefault = 24 * 60 * 60; // 24h;

  @Inject
  SamlConfig(@GerritServerConfig Config cfg) {
    serviceProviderEntityId = getString(cfg, "serviceProviderEntityId");
    metadataPath = getString(cfg, "metadataPath");
    keystorePath = getString(cfg, "keystorePath");
    privateKeyPassword = getString(cfg, "privateKeyPassword");
    keystorePassword = getString(cfg, "keystorePassword");
    displayNameAttr = getGetStringWithDefault(cfg, "displayNameAttr", "DisplayName");
    userNameAttr = getGetStringWithDefault(cfg, "userNameAttr", "UserName");
    emailAddressAttr = getGetStringWithDefault(cfg, "emailAddressAttr", "EmailAddress");
    maxAuthLifetimeAttr = cfg.getInt("saml", "maxAuthLifetime", maxAuthLifetimeDefault);
    computedDisplayName = cfg.getBoolean(SAML_SECTION, "computedDisplayName", false);
    firstNameAttr = getGetStringWithDefault(cfg, "firstNameAttr", "FirstName");
    lastNameAttr = getGetStringWithDefault(cfg, "lastNameAttr", "LastName");
  }

  public String getMetadataPath() {
    return metadataPath;
  }

  public String getKeystorePath() {
    return keystorePath;
  }

  public String getPrivateKeyPassword() {
    return privateKeyPassword;
  }

  public String getKeystorePassword() {
    return keystorePassword;
  }

  public String getDisplayNameAttr() {
    return displayNameAttr;
  }

  public String getUserNameAttr() {
    return userNameAttr;
  }

  public String getEmailAddressAttr() {
    return emailAddressAttr;
  }

  public int getMaxAuthLifetimeAttr() {
    return maxAuthLifetimeAttr;
  }

  private static String getString(Config cfg, String name) {
    return cfg.getString(SAML_SECTION, null, name);
  }

  private static String getGetStringWithDefault(Config cfg, String name, String defaultValue) {
    String result = getString(cfg, name);
    if (result != null) {
      return result;
    }
    return defaultValue;
  }

  public String getFirstNameAttr() {
    return firstNameAttr;
  }

  public String getLastNameAttr() {
    return lastNameAttr;
  }

  public boolean isComputedDisplayName() {
    return computedDisplayName;
  }

  public String getServiceProviderEntityId() {
    return serviceProviderEntityId;
  }
}
