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

import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FAAccountId;
import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceId;
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.factor.domain.model.airlock2fa.event.Airlock2FADeviceActivatedImpl;
import com.airlock.iam.factor.domain.model.airlock2fa.event.Airlock2FADeviceDeletedImpl;
import com.airlock.iam.factor.domain.model.airlock2fa.event.Airlock2FADeviceEventFactory;
import com.airlock.iam.factor.domain.model.airlock2fa.event.Airlock2FADeviceInCooldownUsedImpl;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import lombok.NonNull;

public final class Airlock2FADeviceEventFactoryImpl implements Airlock2FADeviceEventFactory {
   private final Provider<EventCreationData> creationData;
   private final Provider<EventPublisher> eventPublisher;

   @Inject
   public Airlock2FADeviceEventFactoryImpl(@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 publishAirlock2FADeviceActivatedEvent(UserId iamUserId, Airlock2FAAccountId accountId, Airlock2FADeviceId deviceId) {
      ((EventPublisher)this.eventPublisher.get())
         .publish(new Airlock2FADeviceActivatedImpl((EventCreationData)this.creationData.get(), iamUserId, accountId, deviceId));
   }

   @Override
   public void publishAirlock2FADeviceDeletedEvent(UserId iamUserId, Airlock2FAAccountId accountId, Airlock2FADeviceId deviceId) {
      ((EventPublisher)this.eventPublisher.get())
         .publish(new Airlock2FADeviceDeletedImpl((EventCreationData)this.creationData.get(), iamUserId, accountId, deviceId));
   }

   @Override
   public void publishAirlock2FADeviceInCooldownUsed(UserId iamUserId, Airlock2FAAccountId accountId, Airlock2FADeviceId deviceId) {
      ((EventPublisher)this.eventPublisher.get())
         .publish(new Airlock2FADeviceInCooldownUsedImpl((EventCreationData)this.creationData.get(), iamUserId, accountId, deviceId));
   }
}
