package com.airlock.iam.oauth2.domain.service.clientauthentication.clientsecret;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import java.util.Optional;
import lombok.NonNull;

public record OAuth2HeaderClientSecretMethodSettings(
   @NonNull String headerField, @NonNull Optional<String> headerPrefix, @NonNull Optional<String> clientSecretFormat, boolean base64EncodeClientSecretValue
) {
   @SuppressFBWarnings(justification = "generated code")
   public OAuth2HeaderClientSecretMethodSettings {
      if (headerField == null) {
         throw new NullPointerException("headerField is marked non-null but is null");
      }

      if (headerPrefix == null) {
         throw new NullPointerException("headerPrefix is marked non-null but is null");
      }

      if (clientSecretFormat == null) {
         throw new NullPointerException("clientSecretFormat is marked non-null but is null");
      }
   }

   public OAuth2HeaderClientSecretMethodSettings(
      @NonNull String headerField, @Nullable String headerPrefix, @Nullable String clientSecretFormat, boolean base64EncodeClientSecretValue
   ) {
      this(headerField, Optional.ofNullable(headerPrefix), Optional.ofNullable(clientSecretFormat), base64EncodeClientSecretValue);
      if (headerField == null) {
         throw new NullPointerException("headerField is marked non-null but is null");
      }
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2HeaderClientSecretMethodSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String headerField;
      @SuppressFBWarnings(justification = "generated code")
      private String headerPrefix;
      @SuppressFBWarnings(justification = "generated code")
      private String clientSecretFormat;
      @SuppressFBWarnings(justification = "generated code")
      private boolean base64EncodeClientSecretValue;

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2HeaderClientSecretMethodSettings.OAuth2HeaderClientSecretMethodSettingsBuilder headerField(@NonNull String headerField) {
         if (headerField == null) {
            throw new NullPointerException("headerField is marked non-null but is null");
         }

         this.headerField = headerField;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2HeaderClientSecretMethodSettings.OAuth2HeaderClientSecretMethodSettingsBuilder headerPrefix(@Nullable String headerPrefix) {
         this.headerPrefix = headerPrefix;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2HeaderClientSecretMethodSettings.OAuth2HeaderClientSecretMethodSettingsBuilder clientSecretFormat(@Nullable String clientSecretFormat) {
         this.clientSecretFormat = clientSecretFormat;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2HeaderClientSecretMethodSettings.OAuth2HeaderClientSecretMethodSettingsBuilder base64EncodeClientSecretValue(
         boolean base64EncodeClientSecretValue
      ) {
         this.base64EncodeClientSecretValue = base64EncodeClientSecretValue;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2HeaderClientSecretMethodSettings build() {
         return new OAuth2HeaderClientSecretMethodSettings(this.headerField, this.headerPrefix, this.clientSecretFormat, this.base64EncodeClientSecretValue);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2HeaderClientSecretMethodSettings.OAuth2HeaderClientSecretMethodSettingsBuilder(headerField="
            + this.headerField
            + ", headerPrefix="
            + this.headerPrefix
            + ", clientSecretFormat="
            + this.clientSecretFormat
            + ", base64EncodeClientSecretValue="
            + this.base64EncodeClientSecretValue
            + ")";
      }
   }
}
