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.authmethod.AuthenticationMethod;
import com.airlock.iam.common.domain.model.authentication.AuthenticationMethodChangedImpl;
import com.airlock.iam.common.domain.model.event.AuthenticationMethodChangedEventFactory;
import jakarta.annotation.Nullable;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

public final class AuthenticationMethodChangedEventFactoryImpl implements AuthenticationMethodChangedEventFactory {
   private final Provider<EventCreationData> eventCreationData;
   private final Provider<EventPublisher> eventPublisher;

   @Inject
   public AuthenticationMethodChangedEventFactoryImpl(Provider<EventCreationData> eventCreationData, Provider<EventPublisher> eventPublisher) {
      this.eventCreationData = eventCreationData;
      this.eventPublisher = eventPublisher;
   }

   @Override
   public void publishAuthenticationMethodChanged(
      UserId userId, @Nullable AuthenticationMethod activeAuthenticationMethod, @Nullable AuthenticationMethod previousAuthenticationMethod
   ) {
      AuthenticationMethodChangedImpl event = new AuthenticationMethodChangedImpl(
         userId,
         Optional.ofNullable(activeAuthenticationMethod),
         Optional.ofNullable(previousAuthenticationMethod),
         (EventCreationData)this.eventCreationData.get()
      );
      ((EventPublisher)this.eventPublisher.get()).publish(event);
   }
}
