package com.airlock.iam.flow.shared.domain.model.valueprovider;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.ConditionalValueMapProviderConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.Map;

@LogicForConfig(ConditionalValueMapProviderConfig.class)
public class ConditionalValueMapProvider implements ValueMapProvider {
   private static final ELogger LOG = ELoggerFactory.getLogger(ConditionalValueMapProvider.class);
   private final Provider<FlowCondition> condition;
   private final Provider<ValueMapProvider> valueMapProvider;

   @Inject
   public ConditionalValueMapProvider(Provider<FlowCondition> condition, Provider<ValueMapProvider> valueMapProvider) {
      this.condition = condition;
      this.valueMapProvider = valueMapProvider;
   }

   @Override
   public Map<String, Object> provideValueMap() {
      if (((FlowCondition)this.condition.get()).isFulfilled()) {
         return ((ValueMapProvider)this.valueMapProvider.get()).provideValueMap();
      }

      LOG.debug("Condition %s is not fulfilled, no values provided".formatted(LogUtil.quote(((FlowCondition)this.condition.get()).displayName())));
      return Collections.emptyMap();
   }
}
