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

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.PluginListProperty;
import com.airlock.iam.plugin.api.annotation.property.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(
   description = "Configures the contents of the \"<code>acr</code>\" (Authentication Context Class Reference) claim in the ID Token, if the flow authentication was used for the OpenID Connect handshake. Note that requesting ACR values is only supported using the \"<code>acr_values</code>\" claim, but not using the \"<code>claims</code>\" request parameter.",
   displayName = "Flow Condition-based OIDC ID Token ACR Value"
)
@PluginLicenseRestriction(moduleAffiliation = "OAuthServer")
public final class OpenIdConnectAcrMappingClaimConfig implements OpenIdConnectAcrClaimConfig {
   @PluginListProperty(
      description = "Mappings from a flow condition to ACR values used to determine the OpenID Connect ID Token ACR value. The matching will be done in this order:<ol><li>If <code>acr_values</code> have been requested, they are matched in the requested order against these mappings. The first acr value for which a flow condition matches is used.</li><li>If no <code>acr_values</code> have been requested or none could be satisfied, this list is processed in order and the first acr value for which a flow condition matches is used.</li><li>If no acr value could be determined so far, the \"Default ACR\" value below is used (if any).</li></ol>",
      optional = false
   )
   private List<OpenIdConnectFlowConditionToAcrMappingConfig> mappings;
   @StringProperty(description = "Default ACR to issue. This only applies if no mapping matched.", displayName = "Default ACR", optional = true)
   private String defaultAcr;

   public List<OpenIdConnectFlowConditionToAcrMappingConfig> getMappings() {
      return this.mappings;
   }

   public String getDefaultAcr() {
      return this.defaultAcr;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public OpenIdConnectAcrMappingClaimConfig(List<OpenIdConnectFlowConditionToAcrMappingConfig> mappings, String defaultAcr) {
      this.mappings = mappings;
      this.defaultAcr = defaultAcr;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OpenIdConnectAcrMappingClaimConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private List<OpenIdConnectFlowConditionToAcrMappingConfig> mappings;
      @SuppressFBWarnings(justification = "generated code")
      private String defaultAcr;

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

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAcrMappingClaimConfig.OpenIdConnectAcrMappingClaimConfigBuilder mappings(List<OpenIdConnectFlowConditionToAcrMappingConfig> mappings) {
         this.mappings = mappings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAcrMappingClaimConfig.OpenIdConnectAcrMappingClaimConfigBuilder defaultAcr(String defaultAcr) {
         this.defaultAcr = defaultAcr;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectAcrMappingClaimConfig build() {
         return new OpenIdConnectAcrMappingClaimConfig(this.mappings, this.defaultAcr);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OpenIdConnectAcrMappingClaimConfig.OpenIdConnectAcrMappingClaimConfigBuilder(mappings="
            + this.mappings
            + ", defaultAcr="
            + this.defaultAcr
            + ")";
      }
   }
}
