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

import com.airlock.iam.base.misc.message.MessageTemplate;
import com.airlock.iam.common.api.domain.model.encoder.StringEncoder;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import com.airlock.iam.flow.shared.domain.model.message.EncodingMessageTemplate;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import java.util.Map;

public final class TemplateString {
   private final String template;
   private final ValueMapProvider valuesProvider;
   private final List<StringEncoder> encoders;

   public String getValue() {
      Map<String, Object> values = this.valuesProvider.provideValueMap();
      EncodingMessageTemplate messageTemplate = EncodingMessageTemplate.encodingMessageTemplate(
         MessageTemplate.fromNamedParameters(this.template, values), this::encodeValue
      );
      return messageTemplate.formatMessage();
   }

   private String encodeValue(String value) {
      String encoded = value;

      for (StringEncoder encoder : this.encoders) {
         encoded = encoder.encodeString(encoded);
      }

      return encoded;
   }

   @SuppressFBWarnings(justification = "generated code")
   public TemplateString(String template, ValueMapProvider valuesProvider, List<StringEncoder> encoders) {
      this.template = template;
      this.valuesProvider = valuesProvider;
      this.encoders = encoders;
   }
}
