package com.airlock.iam.flow.shared.domain.service.additionalattributes;

import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.domain.model.step.attributes.CustomAttributesAdder;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

public class DefaultCustomAttributesAdder implements CustomAttributesAdder {
   private static final ELogger LOG = ELoggerFactory.getLogger(DefaultCustomAttributesAdder.class);
   private final Provider<CustomAttributesValueProviders> customAttributes;

   @Inject
   public DefaultCustomAttributesAdder(Provider<CustomAttributesValueProviders> customAttributes) {
      this.customAttributes = customAttributes;
   }

   @Override
   public StepResult addCustomAttributes(StepResult stepResult) {
      if (stepResult.error().isPresent()) {
         this.addToAdditionalAttributes(((CustomAttributesValueProviders)this.customAttributes.get()).failureValueProvider(), stepResult);
      } else {
         this.addToAdditionalAttributes(((CustomAttributesValueProviders)this.customAttributes.get()).successValueProvider(), stepResult);
      }

      return stepResult;
   }

   private void addToAdditionalAttributes(ValueMapProvider valueMapProvider, StepResult stepResult) {
      try {
         valueMapProvider.provideValueMap()
            .entrySet()
            .stream()
            .filter(e -> e.getValue() != null)
            .forEach(entry -> stepResult.additionalAttributes().putCustomAttribute(entry.getKey(), entry.getValue()));
      } catch (Exception e) {
         LOG.info("Could not add custom attributes to step result.", e);
      }
   }
}
