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

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

@Plugin(
   description = "Sets the UI Tenant ID to a static value if the OAuth 2.0 client ID for an authorization code grant request\nmatches a regex pattern.",
   displayName = "OAuth 2.0 Client ID Pattern UI Tenant ID Rule"
)
@PluginLicenseRestriction(moduleAffiliation = "OAuthServer")
public final class OAuth2ClientIdPatternUiTenantIdRuleConfig implements UiTenantIdRuleConfig {
   @RegexProperty(
      displayName = "OAuth 2.0 Client ID Pattern",
      description = "If the OAuth 2.0 client ID matches this pattern, the UI tenant ID will be set to the value of UI Tenant ID Value.",
      exampleValues = {".*", ".*-admin", "(.*)@mail\\.com"},
      optional = false
   )
   private Pattern clientIdPattern;
   private static final String CLIENT_ID_PATTERN_DISPLAY_NAME = "OAuth 2.0 Client ID Pattern";
   @StringProperty(
      displayName = "UI Tenant ID Value",
      description = "If the OAuth 2.0 client ID matches OAuth 2.0 Client ID Pattern, the UI tenant ID will be set to the value configured by this plugin. This replacement pattern may contain back-references to the pattern configured in OAuth 2.0 Client ID Pattern.",
      exampleValues = {"$1", "fixed-value", "tenant-id-$1"},
      optional = false
   )
   private String uiTenantIdValue;
   private static final String UI_TENANT_ID_VALUE_DISPLAY_NAME = "UI Tenant ID Value";

   public Pattern getClientIdPattern() {
      return this.clientIdPattern;
   }

   public String getUiTenantIdValue() {
      return this.uiTenantIdValue;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2ClientIdPatternUiTenantIdRuleConfig(Pattern clientIdPattern, String uiTenantIdValue) {
      this.clientIdPattern = clientIdPattern;
      this.uiTenantIdValue = uiTenantIdValue;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2ClientIdPatternUiTenantIdRuleConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Pattern clientIdPattern;
      @SuppressFBWarnings(justification = "generated code")
      private String uiTenantIdValue;

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientIdPatternUiTenantIdRuleConfig.OAuth2ClientIdPatternUiTenantIdRuleConfigBuilder clientIdPattern(Pattern clientIdPattern) {
         this.clientIdPattern = clientIdPattern;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientIdPatternUiTenantIdRuleConfig.OAuth2ClientIdPatternUiTenantIdRuleConfigBuilder uiTenantIdValue(String uiTenantIdValue) {
         this.uiTenantIdValue = uiTenantIdValue;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ClientIdPatternUiTenantIdRuleConfig build() {
         return new OAuth2ClientIdPatternUiTenantIdRuleConfig(this.clientIdPattern, this.uiTenantIdValue);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2ClientIdPatternUiTenantIdRuleConfig.OAuth2ClientIdPatternUiTenantIdRuleConfigBuilder(clientIdPattern="
            + this.clientIdPattern
            + ", uiTenantIdValue="
            + this.uiTenantIdValue
            + ")";
      }
   }
}
