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

import com.airlock.iam.flow.api.application.configuration.selection.FlowConditionConfig;
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.RegexProperty;
import com.airlock.iam.plugin.api.annotation.property.RegexProperty.CaseSensitivitySelector;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.regex.Pattern;

@Plugin(
   description = "<p>Condition that is fulfilled if the username matches the configured regex.</p><p>This condition uses the transformed \"tentative\" username, which is available as soon as the provided username is resolved. This means that it can be used inside, but not before, a user identifying step.</p><p>If no user has been identified yet, the condition is not fulfilled.</p>",
   displayName = "Matching Username"
)
public class UsernameMatchingConditionConfig implements FlowConditionConfig {
   @RegexProperty(
      description = "The regular expression against which the username is matched.",
      optional = false,
      exampleValues = {".*@host1.com", "[a-z]@other.net", "(super)?admin"},
      caseSensitivity = CaseSensitivitySelector.CONFIGURED_BY_PROPERTY,
      caseSensitivityProperty = "caseSensitive"
   )
   private Pattern pattern;
   @BooleanProperty(
      description = "If disabled, the case of characters is ignored when matching the pattern against the username.",
      optional = true,
      defaultValue = "true"
   )
   private boolean caseSensitive;

   public Pattern getPattern() {
      return this.pattern;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public UsernameMatchingConditionConfig(Pattern pattern, boolean caseSensitive) {
      this.pattern = pattern;
      this.caseSensitive = caseSensitive;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class UsernameMatchingConditionConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Pattern pattern;
      @SuppressFBWarnings(justification = "generated code")
      private boolean caseSensitive;

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

      @SuppressFBWarnings(justification = "generated code")
      public UsernameMatchingConditionConfig.UsernameMatchingConditionConfigBuilder pattern(Pattern pattern) {
         this.pattern = pattern;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UsernameMatchingConditionConfig.UsernameMatchingConditionConfigBuilder caseSensitive(boolean caseSensitive) {
         this.caseSensitive = caseSensitive;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UsernameMatchingConditionConfig build() {
         return new UsernameMatchingConditionConfig(this.pattern, this.caseSensitive);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "UsernameMatchingConditionConfig.UsernameMatchingConditionConfigBuilder(pattern="
            + this.pattern
            + ", caseSensitive="
            + this.caseSensitive
            + ")";
      }
   }
}
