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

import com.airlock.iam.base.api.domain.model.event.EventType;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.domain.model.event.EventCreationData;
import com.airlock.iam.common.domain.model.event.AbstractAuthenticationDeviceEvent;
import com.airlock.iam.core.domain.model.authentication.method.KnownAuthenticationMethods;
import com.airlock.iam.factor.domain.model.event.FactorEventTypes;
import com.airlock.iam.fido.api.domain.model.FidoCredentialId;
import com.airlock.iam.fido.api.domain.model.FidoPublicKeyCredentialId;
import com.airlock.iam.fido.api.domain.model.FidoRelyingPartyId;
import com.airlock.iam.fido.api.domain.model.event.FidoCredentialRegistered;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import lombok.NonNull;

public final class FidoCredentialRegisteredImpl extends AbstractAuthenticationDeviceEvent implements FidoCredentialRegistered {
   @NonNull
   private final FidoCredentialId credentialId;
   @NonNull
   private final FidoRelyingPartyId relyingPartyId;
   @NonNull
   private final FidoPublicKeyCredentialId publicKeyCredentialId;

   public FidoCredentialRegisteredImpl(
      EventCreationData eventCreationData,
      UserId userId,
      @NonNull FidoCredentialId credentialId,
      @NonNull FidoRelyingPartyId relyingPartyId,
      @NonNull FidoPublicKeyCredentialId publicKeyCredentialId
   ) {
      super(eventCreationData, "FIDO Credential Registered", userId, KnownAuthenticationMethods.FIDO);
      if (credentialId == null) {
         throw new NullPointerException("credentialId is marked non-null but is null");
      }

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

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

      this.credentialId = credentialId;
      this.relyingPartyId = relyingPartyId;
      this.publicKeyCredentialId = publicKeyCredentialId;
   }

   @Override
   public EventType type() {
      return FactorEventTypes.FIDO_CREDENTIAL_REGISTERED;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public FidoCredentialId credentialId() {
      return this.credentialId;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public FidoRelyingPartyId relyingPartyId() {
      return this.relyingPartyId;
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   @Override
   public FidoPublicKeyCredentialId publicKeyCredentialId() {
      return this.publicKeyCredentialId;
   }
}
