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.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 = "URL-encodes a string.", displayName = "URL String Encoder")
public final class UrlStringEncoderConfig 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";

   @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);
   }

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

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

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

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

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

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

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "UrlStringEncoderConfig.UrlStringEncoderConfigBuilder(encodingScheme=" + this.encodingScheme + ")";
      }
   }
}
