package com.airlock.iam.admin.domain.model.event;

import com.airlock.iam.admin.api.domain.service.user.ManagedUserRepository;
import com.airlock.iam.admin.application.configuration.event.ContextDataRecipientConfig;
import com.airlock.iam.base.api.domain.model.email.EmailAddress;
import com.airlock.iam.base.api.domain.model.event.DomainEvent;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.contextdata.ContextData;
import com.airlock.iam.common.api.domain.model.event.UserEvent;
import com.airlock.iam.common.api.domain.model.user.User;
import com.airlock.iam.common.domain.service.event.EventEmailRecipientProvider;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(ContextDataRecipientConfig.class)
public final class ContextDataRecipientProvider implements EventEmailRecipientProvider {
   private final Provider<ContextDataRecipientConfig> config;
   private final Provider<ManagedUserRepository> repository;

   @Inject
   public ContextDataRecipientProvider(Provider<ContextDataRecipientConfig> config, Provider<ManagedUserRepository> repository) {
      this.config = config;
      this.repository = repository;
   }

   public Optional<EmailAddress> provideRecipientAddress(DomainEvent event) {
      return event instanceof UserEvent userEvent
         ? ((ManagedUserRepository)this.repository.get())
            .findById(userEvent.userId())
            .<ContextData>map(User::getContextData)
            .map(contextData -> contextData.asKeyValueMap().get(((ContextDataRecipientConfig)this.config.get()).getContextDataName().getContextDataName()))
            .map(String::valueOf)
            .flatMap(EmailAddress::emailAddress)
         : Optional.empty();
   }
}
