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

import com.airlock.iam.authentication.application.configuration.valueprovider.SsoTicketContextDataProviderConfig;
import com.airlock.iam.authentication.domain.model.sso.SsoFlowSessionAttribute;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.domain.service.sso.ContextDataEntry;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import com.airlock.iam.flow.shared.api.domain.service.FlowAttributeService;
import com.google.common.annotations.VisibleForTesting;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@LogicForConfig(SsoTicketContextDataProviderConfig.class)
public final class SsoTicketContextDataProvider implements ValueMapProvider {
   private final Provider<FlowAttributeService> attributes;

   @Inject
   public SsoTicketContextDataProvider(Provider<FlowAttributeService> attributes) {
      this.attributes = attributes;
   }

   @Override
   public Map<String, Object> provideValueMap() {
      return this.provideContextData().stream().collect(Collectors.toMap(ContextDataEntry::key, ContextDataEntry::value));
   }

   @VisibleForTesting
   Set<ContextDataEntry> provideContextData() {
      return ((FlowAttributeService)this.attributes.get())
         .findAttribute(SsoFlowSessionAttribute.class)
         .map(SsoFlowSessionAttribute::getContextData)
         .orElse(Set.of());
   }
}
