package com.airlock.iam.common.domain.model.mtan.event;

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.api.domain.model.event.MtanTokenDeleted;
import com.airlock.iam.common.api.domain.model.mtan.MtanNumberId;
import com.airlock.iam.common.api.domain.model.phonenumber.PhoneNumber;
import com.airlock.iam.common.domain.model.event.AbstractAuthenticationDeviceEvent;
import com.airlock.iam.common.domain.model.event.CommonEventTypes;
import com.airlock.iam.core.domain.model.authentication.method.KnownAuthenticationMethods;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import lombok.NonNull;

public final class MtanTokenDeletedImpl extends AbstractAuthenticationDeviceEvent implements MtanTokenDeleted {
   private final MtanNumberId mtanNumberId;
   private final PhoneNumber oldNumber;

   public MtanTokenDeletedImpl(@NonNull EventCreationData creationData, @NonNull UserId userId, @NonNull MtanNumberId mtanNumberId, PhoneNumber oldNumber) {
      super(creationData, "Phone Number Deleted", userId, KnownAuthenticationMethods.MTAN);
      if (creationData == null) {
         throw new NullPointerException("creationData is marked non-null but is null");
      }

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

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

      this.mtanNumberId = mtanNumberId;
      this.oldNumber = oldNumber;
   }

   @Override
   public PhoneNumber oldPhoneNumber() {
      return this.oldNumber;
   }

   @Override
   public EventType type() {
      return CommonEventTypes.MTAN_TOKEN_DELETED;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public MtanNumberId mtanNumberId() {
      return this.mtanNumberId;
   }

   @SuppressFBWarnings(justification = "generated code")
   public PhoneNumber oldNumber() {
      return this.oldNumber;
   }
}
