package com.airlock.iam.oauth2.application.configuration.clientauthentication;

import com.airlock.iam.core.misc.plugin.config.validation.CharsetValidator;
import com.airlock.iam.plugin.api.annotation.config.ConfigurationValidator;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.license.PluginLicenseRestriction;
import com.airlock.iam.plugin.api.annotation.property.StringProperty;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.api.config.Environment;
import com.airlock.iam.plugin.api.config.PluginConfiguration;
import com.airlock.iam.plugin.api.exception.ConfigurationException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(
   description = "Basic auth scheme for OAuth 2.0 requests.<p><b>Note</b>: The basic auth scheme in OAuth 2.0 requests must comply to the specification in <a href=\"https://tools.ietf.org/html/rfc6749#section-2.3.1\" target=\"_blank\">RFC 6749</a></p>",
   displayName = "OAuth 2.0 Basic Auth Client Secret (AS)"
)
@PluginLicenseRestriction(moduleAffiliation = "OAuthServer")
public class OAuth2BasicAuthClientSecretMethodConfig implements OAuth2ClientSecretMethodConfig {
   public static final String OAUTH_2_BASIC_AUTH_CLIENT_SECRET = "OAuth 2.0 Basic Auth Client Secret (AS)";
   @StringProperty(
      description = "Defines the charset of the Basic Auth HTTP header. If you have trouble accepting special characters, try \"ISO-8859-1\" instead.",
      exampleValues = {"UTF-8", "ISO-8859-1"},
      defaultValue = "UTF-8",
      optional = true
   )
   private String charset;
   static final String CHARSET_FIELD = "charset";

   @ConfigurationValidator
   public static void checkCharset(PluginConfiguration configuration, ConfigurationEnvironment env, ConfigurationContext context, Environment environment) throws ConfigurationException {
      CharsetValidator.validateCharsetProperty("charset", configuration, env, context);
   }

   public String getCharset() {
      return this.charset;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static OAuth2BasicAuthClientSecretMethodConfig.OAuth2BasicAuthClientSecretMethodConfigBuilder builder() {
      return new OAuth2BasicAuthClientSecretMethodConfig.OAuth2BasicAuthClientSecretMethodConfigBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2BasicAuthClientSecretMethodConfig() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2BasicAuthClientSecretMethodConfig(String charset) {
      this.charset = charset;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2BasicAuthClientSecretMethodConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String charset;

      @SuppressFBWarnings(justification = "generated code")
      OAuth2BasicAuthClientSecretMethodConfigBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2BasicAuthClientSecretMethodConfig.OAuth2BasicAuthClientSecretMethodConfigBuilder charset(String charset) {
         this.charset = charset;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2BasicAuthClientSecretMethodConfig build() {
         return new OAuth2BasicAuthClientSecretMethodConfig(this.charset);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2BasicAuthClientSecretMethodConfig.OAuth2BasicAuthClientSecretMethodConfigBuilder(charset=" + this.charset + ")";
      }
   }
}
