package com.airlock.iam.common.domain.model.credential;

import com.airlock.iam.core.misc.authen.credential.Credential;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import java.util.Objects;
import java.util.Optional;
import lombok.NonNull;

public class CredentialInfo {
   @NonNull
   private final Credential credential;
   @NonNull
   private final Optional<String> providedUsername;
   @NonNull
   private final Optional<String> certificateSubjectDn;

   public CredentialInfo(Credential credential, @Nullable String providedUsername) {
      Objects.requireNonNull(credential);
      this.credential = credential;
      this.providedUsername = Optional.ofNullable(providedUsername);
      this.certificateSubjectDn = Optional.empty();
   }

   public CredentialInfo(Credential credential) {
      this(credential, null);
   }

   @SuppressFBWarnings(justification = "generated code")
   public CredentialInfo(@NonNull Credential credential, @NonNull Optional<String> providedUsername, @NonNull Optional<String> certificateSubjectDn) {
      if (credential == null) {
         throw new NullPointerException("credential is marked non-null but is null");
      }

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

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

      this.credential = credential;
      this.providedUsername = providedUsername;
      this.certificateSubjectDn = certificateSubjectDn;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public Credential getCredential() {
      return this.credential;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public Optional<String> getProvidedUsername() {
      return this.providedUsername;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public Optional<String> getCertificateSubjectDn() {
      return this.certificateSubjectDn;
   }
}
