package com.airlock.iam.ssi.domain.service;

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.ssi.application.configuration.SsiAttributeMapping;
import com.airlock.iam.ssi.domain.model.step.SsiIssuanceStepSettings;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Map;
import java.util.Optional;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class SsiAttributeAssemblerService {
   private final Provider<SsiIssuanceStepSettings> settings;

   @Inject
   public SsiAttributeAssemblerService(Provider<SsiIssuanceStepSettings> settings) {
      this.settings = settings;
   }

   public Map<String, String> assembleAttributes() {
      return ((SsiIssuanceStepSettings)this.settings.get())
         .attributeMappings()
         .stream()
         .map(this::toEntry)
         .flatMap(Optional::stream)
         .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
   }

   private Optional<Entry<String, String>> toEntry(SsiAttributeMapping attributeMapping) {
      if (((SsiIssuanceStepSettings)this.settings.get()).valueMapProvider().provideValueMap().get(attributeMapping.getValueMapKey()) instanceof String stringValue
         )
       {
         return Optional.of(Map.entry(attributeMapping.getAttributeName(), stringValue));
      } else {
         getLogger()
            .info(
               "Attribute mapping with value map key %s and attribute name %s is null or not a string value, and will be ignored"
                  .formatted(LogUtil.quote(attributeMapping.getValueMapKey()), LogUtil.quote(attributeMapping.getAttributeName()))
            );
         return Optional.empty();
      }
   }

   private static ELogger getLogger() {
      return ELoggerFactory.getLogger(SsiAttributeAssemblerService.class);
   }
}
