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

import com.airlock.iam.oauth2.application.configuration.OpenIdConnectAcrClaimConfig;
import com.airlock.iam.oauth2.application.configuration.openid.signature.OpenIDConnectIDTokenMACSignatureSigner;
import com.airlock.iam.oauth2.domain.model.token.OpenIDConnectIDTokenSigner;
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.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

@Plugin(description = "Defines the format and structure of the issued OpenID Connect ID Token.", displayName = "OIDC ID Token")
@PluginLicenseRestriction(moduleAffiliation = "OAuthServer")
public final class OpenIdConnectIdTokenConfig {
   @PluginProperty(
      description = "OpenID Connect claim configuration for the issuer and additional custom claims written to the ID Tokens.",
      optional = true,
      defaultValue = OpenIDConnectClaimsConfiguration.class
   )
   private OpenIDConnectClaimsConfiguration claims;
   public static final String CLAIMS_FIELD = "claims";
   @PluginProperty(
      description = "OpenID Connect ACR value. If not configured, the ID Token will not contain any \"<code>acr</code>\" value for OpenID Connect handshakes using the flow authentication.",
      displayName = "ACR Claim (Flow)",
      optional = true
   )
   private OpenIdConnectAcrClaimConfig acrClaim;
   @PluginProperty(
      description = "ID Token Signature configuration. <b>Security Warning:</b> Using 'No Signature' is not recommended.",
      defaultValue = OpenIDConnectIDTokenMACSignatureSigner.class,
      optional = true
   )
   private OpenIDConnectIDTokenSigner signer;
   public static final String SIGNER_FIELD = "signer";

   public Optional<OpenIdConnectAcrClaimConfig> getAcrClaim() {
      return Optional.ofNullable(this.acrClaim);
   }

   public OpenIDConnectClaimsConfiguration getClaims() {
      return this.claims;
   }

   public OpenIDConnectIDTokenSigner getSigner() {
      return this.signer;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public OpenIdConnectIdTokenConfig(OpenIDConnectClaimsConfiguration claims, OpenIdConnectAcrClaimConfig acrClaim, OpenIDConnectIDTokenSigner signer) {
      this.claims = claims;
      this.acrClaim = acrClaim;
      this.signer = signer;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OpenIdConnectIdTokenConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private OpenIDConnectClaimsConfiguration claims;
      @SuppressFBWarnings(justification = "generated code")
      private OpenIdConnectAcrClaimConfig acrClaim;
      @SuppressFBWarnings(justification = "generated code")
      private OpenIDConnectIDTokenSigner signer;

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

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenConfig.OpenIdConnectIdTokenConfigBuilder claims(OpenIDConnectClaimsConfiguration claims) {
         this.claims = claims;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenConfig.OpenIdConnectIdTokenConfigBuilder acrClaim(OpenIdConnectAcrClaimConfig acrClaim) {
         this.acrClaim = acrClaim;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenConfig.OpenIdConnectIdTokenConfigBuilder signer(OpenIDConnectIDTokenSigner signer) {
         this.signer = signer;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OpenIdConnectIdTokenConfig build() {
         return new OpenIdConnectIdTokenConfig(this.claims, this.acrClaim, this.signer);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OpenIdConnectIdTokenConfig.OpenIdConnectIdTokenConfigBuilder(claims="
            + this.claims
            + ", acrClaim="
            + this.acrClaim
            + ", signer="
            + this.signer
            + ")";
      }
   }
}
