package com.airlock.iam.common.domain.model.valueprovider;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.transform.StringTransformer;
import com.airlock.iam.common.api.domain.model.valueprovider.ValueProvider;
import com.airlock.iam.common.application.configuration.valueprovider.TransformingStringValueProviderConfig;
import jakarta.annotation.Nullable;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;
import java.util.function.Function;
import java.util.function.UnaryOperator;

@LogicForConfig(TransformingStringValueProviderConfig.class)
public class TransformingStringValueProvider implements ValueProvider<String> {
   private final Provider<ValueProvider<String>> source;
   private final Provider<List<StringTransformer>> transformers;

   @Inject
   public TransformingStringValueProvider(Provider<ValueProvider<String>> source, Provider<List<StringTransformer>> transformers) {
      this.source = source;
      this.transformers = transformers;
   }

   @Nullable
   public String getValue() {
      String input = (String)((ValueProvider)this.source.get()).getValue();
      return (String)((Function)((List)this.transformers.get()).stream().map(f -> (Function)f).reduce(UnaryOperator.identity(), Function::andThen))
         .apply(input);
   }
}
