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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import com.airlock.iam.flow.shared.api.domain.service.FlowAttributeService;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.ScriptExecutionResultValueMapProviderConfig;
import com.airlock.iam.flow.shared.domain.model.attributes.ScriptExecutionResultFlowAttribute;
import com.airlock.iam.scriptable.domain.model.ScriptNamespace;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

@LogicForConfig(ScriptExecutionResultValueMapProviderConfig.class)
public final class ScriptExecutionResultValueMapProvider implements ValueMapProvider {
   private final Provider<FlowAttributeService> attributes;
   private final Provider<ScriptNamespace> namespace;

   @Inject
   public ScriptExecutionResultValueMapProvider(Provider<FlowAttributeService> attributes, Provider<ScriptNamespace> namespace) {
      this.attributes = attributes;
      this.namespace = namespace;
   }

   @Override
   public Map<String, Object> provideValueMap() {
      return ((FlowAttributeService)this.attributes.get())
         .findAttribute(ScriptExecutionResultFlowAttribute.class)
         .map(ScriptExecutionResultFlowAttribute::getAttributes)
         .map(this::filterNamespace)
         .orElse(Collections.emptyMap());
   }

   private Map<String, Object> filterNamespace(Map<String, Object> map) {
      return map.entrySet()
         .stream()
         .filter(e -> ((ScriptNamespace)this.namespace.get()).isInNamespace(e.getKey()))
         .map(e -> Map.entry(((ScriptNamespace)this.namespace.get()).removeNamespace(e.getKey()), e.getValue()))
         .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
   }
}
