package com.airlock.iam.common.infrastructure.event;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.domain.model.event.EventCreationData;
import com.airlock.iam.base.domain.model.event.EventPublisher;
import com.airlock.iam.common.api.domain.model.event.MtanTokenDeleted;
import com.airlock.iam.common.api.domain.model.event.MtanTokenPhoneNumberChanged;
import com.airlock.iam.common.api.domain.model.event.MtanTokenRegistered;
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.mtan.event.MtanTokenDeletedImpl;
import com.airlock.iam.common.domain.model.mtan.event.MtanTokenEventFactory;
import com.airlock.iam.common.domain.model.mtan.event.MtanTokenPhoneNumberChangedImpl;
import com.airlock.iam.common.domain.model.mtan.event.MtanTokenRegisteredImpl;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import lombok.NonNull;

public final class MtanTokenEventFactoryImpl implements MtanTokenEventFactory {
   private final Provider<EventCreationData> creationData;
   private final Provider<EventPublisher> eventPublisher;

   @Inject
   public MtanTokenEventFactoryImpl(@NonNull Provider<EventCreationData> creationData, @NonNull Provider<EventPublisher> eventPublisher) {
      if (creationData == null) {
         throw new NullPointerException("creationData is marked non-null but is null");
      }

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

      this.creationData = creationData;
      this.eventPublisher = eventPublisher;
   }

   @Override
   public void publishMtanTokenRegisteredEvent(UserId userId, MtanNumberId mtanNumberId, PhoneNumber newPhoneNumber) {
      MtanTokenRegistered event = new MtanTokenRegisteredImpl((EventCreationData)this.creationData.get(), userId, mtanNumberId, newPhoneNumber);
      ((EventPublisher)this.eventPublisher.get()).publish(event);
   }

   @Override
   public void publishMtanTokenDeletedEvent(UserId userId, MtanNumberId mtanNumberId, PhoneNumber oldNumber) {
      MtanTokenDeleted event = new MtanTokenDeletedImpl((EventCreationData)this.creationData.get(), userId, mtanNumberId, oldNumber);
      ((EventPublisher)this.eventPublisher.get()).publish(event);
   }

   @Override
   public void publishMtanNumberChangedEvent(UserId userId, MtanNumberId mtanNumberId, PhoneNumber oldNumber, PhoneNumber newNumber) {
      MtanTokenPhoneNumberChanged event = new MtanTokenPhoneNumberChangedImpl(
         (EventCreationData)this.creationData.get(), userId, mtanNumberId, oldNumber, newNumber
      );
      ((EventPublisher)this.eventPublisher.get()).publish(event);
   }
}
