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.contextdata.ContextData;
import com.airlock.iam.common.api.domain.model.locking.LockReason;
import com.airlock.iam.common.domain.model.event.UserCreatedImpl;
import com.airlock.iam.common.domain.model.event.UserDeletedImpl;
import com.airlock.iam.common.domain.model.event.UserEventFactory;
import com.airlock.iam.common.domain.model.event.UserLockedImpl;
import com.airlock.iam.common.domain.model.event.UserUnlockedImpl;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

public final class UserEventFactoryImpl implements UserEventFactory {
   private final Provider<EventCreationData> creationData;
   private final Provider<EventPublisher> eventPublisher;

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

   @Override
   public void publishUserLockedEvent(UserId userId, LockReason reason) {
      ((EventPublisher)this.eventPublisher.get()).publish(new UserLockedImpl((EventCreationData)this.creationData.get(), userId, reason));
   }

   @Override
   public void publishUserUnlockedEvent(UserId userId) {
      ((EventPublisher)this.eventPublisher.get()).publish(new UserUnlockedImpl((EventCreationData)this.creationData.get(), userId));
   }

   @Override
   public void publishUserCreatedEvent(UserId userId, ContextData contextData) {
      ((EventPublisher)this.eventPublisher.get()).publish(new UserCreatedImpl((EventCreationData)this.creationData.get(), userId, contextData));
   }

   @Override
   public void publishUserDeletedEvent(UserId userId) {
      ((EventPublisher)this.eventPublisher.get()).publish(new UserDeletedImpl((EventCreationData)this.creationData.get(), userId));
   }
}
