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

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.base.infrastructure.event.DomainEventValuesProvider;
import com.airlock.iam.common.application.configuration.event.EventValueRecipientConfig;
import com.airlock.iam.common.domain.service.event.EventEmailRecipientProvider;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

@LogicForConfig(EventValueRecipientConfig.class)
public final class EventValueRecipientProvider implements EventEmailRecipientProvider {
   private final Provider<EventValueRecipientConfig> config;
   private final Provider<DomainEventValuesProvider> valuesProvider;

   @Inject
   public EventValueRecipientProvider(Provider<EventValueRecipientConfig> config, Provider<DomainEventValuesProvider> valuesProvider) {
      this.config = config;
      this.valuesProvider = valuesProvider;
   }

   @Override
   public Optional<EmailAddress> provideRecipientAddress(DomainEvent event) {
      return Optional.ofNullable(
            ((DomainEventValuesProvider)this.valuesProvider.get())
               .provideValueMapForEvent(event)
               .get(((EventValueRecipientConfig)this.config.get()).getEventKey())
         )
         .filter(String.class::isInstance)
         .map(String.class::cast)
         .<String>map(StringUtils::trimToNull)
         .flatMap(EmailAddress::emailAddress);
   }
}
