package com.airlock.iam.flow.shared.application.configuration.valueprovider;

import com.airlock.iam.common.api.application.configuration.valueprovider.StringValueProviderConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import com.airlock.iam.plugin.api.annotation.property.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(description = "Provides a list of roles by parsing the values provided by a string provider.", displayName = "String-based Role Provider")
public final class StringBasedRoleProviderConfig implements RoleProviderConfig {
   @PluginProperty(
      description = "String provider providing a list of roles separated by the separator below. Each role consists of a name that can be followed by an idle timeout and a lifetime, each seperated by a colon. Example: \"roleA,admin:600:3600,roleB\"",
      optional = false
   )
   private StringValueProviderConfig valueProvider;
   @StringProperty(description = "Separator between the roles.", optional = true, defaultValue = ",")
   private String separator;

   public StringValueProviderConfig getValueProvider() {
      return this.valueProvider;
   }

   public String getSeparator() {
      return this.separator;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public StringBasedRoleProviderConfig(StringValueProviderConfig valueProvider, String separator) {
      this.valueProvider = valueProvider;
      this.separator = separator;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class StringBasedRoleProviderConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private StringValueProviderConfig valueProvider;
      @SuppressFBWarnings(justification = "generated code")
      private String separator;

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

      @SuppressFBWarnings(justification = "generated code")
      public StringBasedRoleProviderConfig.StringBasedRoleProviderConfigBuilder valueProvider(StringValueProviderConfig valueProvider) {
         this.valueProvider = valueProvider;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public StringBasedRoleProviderConfig.StringBasedRoleProviderConfigBuilder separator(String separator) {
         this.separator = separator;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public StringBasedRoleProviderConfig build() {
         return new StringBasedRoleProviderConfig(this.valueProvider, this.separator);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "StringBasedRoleProviderConfig.StringBasedRoleProviderConfigBuilder(valueProvider="
            + this.valueProvider
            + ", separator="
            + this.separator
            + ")";
      }
   }
}
