package com.airlock.iam.common.application.configuration.encoder;

import com.airlock.iam.common.api.application.configuration.encoder.StringEncoderConfig;
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.property.BooleanProperty;
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;
import java.nio.charset.Charset;

@Plugin(description = "Base64-encodes a string.", displayName = "Base64 String Encoder")
public final class Base64StringEncoderConfig implements StringEncoderConfig {
   @StringProperty(description = "The scheme used for character encoding.", optional = true, defaultValue = "UTF-8")
   private String encodingScheme;
   private static final String ENCODING_SCHEME_PROPERTY = "encodingScheme";
   @BooleanProperty(
      description = "Whether URL-safe encoding should be used (\"+\" and \"/\" are replaced by \"-\" and \"_\", respectively, and trailing \"=\" are omitted).",
      displayName = "URL-safe Encoding",
      optional = true,
      defaultValue = "false"
   )
   private boolean urlSafeEncoding;

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

   public Charset getEncodingScheme() {
      return Charset.forName(this.encodingScheme);
   }

   public boolean isUrlSafeEncoding() {
      return this.urlSafeEncoding;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public Base64StringEncoderConfig(String encodingScheme, boolean urlSafeEncoding) {
      this.encodingScheme = encodingScheme;
      this.urlSafeEncoding = urlSafeEncoding;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class Base64StringEncoderConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String encodingScheme;
      @SuppressFBWarnings(justification = "generated code")
      private boolean urlSafeEncoding;

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

      @SuppressFBWarnings(justification = "generated code")
      public Base64StringEncoderConfig.Base64StringEncoderConfigBuilder encodingScheme(String encodingScheme) {
         this.encodingScheme = encodingScheme;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Base64StringEncoderConfig.Base64StringEncoderConfigBuilder urlSafeEncoding(boolean urlSafeEncoding) {
         this.urlSafeEncoding = urlSafeEncoding;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Base64StringEncoderConfig build() {
         return new Base64StringEncoderConfig(this.encodingScheme, this.urlSafeEncoding);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "Base64StringEncoderConfig.Base64StringEncoderConfigBuilder(encodingScheme="
            + this.encodingScheme
            + ", urlSafeEncoding="
            + this.urlSafeEncoding
            + ")";
      }
   }
}
