package com.airlock.iam.factor.domain.model.fido;

import com.airlock.iam.factor.domain.model.fido.registration.FidoUserVerificationPreference;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import java.util.Set;
import lombok.NonNull;

public record FidoCredentialAuthenticationSettings(
   @NonNull FidoTimeout authenticationTimeout, @NonNull FidoUserVerificationPreference userVerification, @NonNull Set<FidoTransport> transports
) {
   @SuppressFBWarnings(justification = "generated code")
   public FidoCredentialAuthenticationSettings {
      if (authenticationTimeout == null) {
         throw new NullPointerException("authenticationTimeout is marked non-null but is null");
      }

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

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

   public List<String> transportsAsStrings() {
      return this.transports.stream().map(FidoTransport::getValue).toList();
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class FidoCredentialAuthenticationSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private FidoTimeout authenticationTimeout;
      @SuppressFBWarnings(justification = "generated code")
      private FidoUserVerificationPreference userVerification;
      @SuppressFBWarnings(justification = "generated code")
      private Set<FidoTransport> transports;

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

      @SuppressFBWarnings(justification = "generated code")
      public FidoCredentialAuthenticationSettings.FidoCredentialAuthenticationSettingsBuilder authenticationTimeout(@NonNull FidoTimeout authenticationTimeout) {
         if (authenticationTimeout == null) {
            throw new NullPointerException("authenticationTimeout is marked non-null but is null");
         }

         this.authenticationTimeout = authenticationTimeout;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public FidoCredentialAuthenticationSettings.FidoCredentialAuthenticationSettingsBuilder userVerification(
         @NonNull FidoUserVerificationPreference userVerification
      ) {
         if (userVerification == null) {
            throw new NullPointerException("userVerification is marked non-null but is null");
         }

         this.userVerification = userVerification;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public FidoCredentialAuthenticationSettings.FidoCredentialAuthenticationSettingsBuilder transports(@NonNull Set<FidoTransport> transports) {
         if (transports == null) {
            throw new NullPointerException("transports is marked non-null but is null");
         }

         this.transports = transports;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public FidoCredentialAuthenticationSettings build() {
         return new FidoCredentialAuthenticationSettings(this.authenticationTimeout, this.userVerification, this.transports);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "FidoCredentialAuthenticationSettings.FidoCredentialAuthenticationSettingsBuilder(authenticationTimeout="
            + this.authenticationTimeout
            + ", userVerification="
            + this.userVerification
            + ", transports="
            + this.transports
            + ")";
      }
   }
}
