package com.airlock.iam.authentication.infrastructure.factory;

import com.airlock.iam.base.api.domain.model.validation.ValidationResult;
import com.airlock.iam.flow.domain.service.FlowRequestAttributeExtractor;
import com.airlock.iam.flow.shared.application.configuration.FlowRequestAttributeConfig;
import com.airlock.iam.login.domain.model.credential.RequestAttributeExtractor;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;

public class FlowRequestAttributeExtractorModule extends PrivateModule {
   @Provides
   @RequestScoped
   @Exposed
   FlowRequestAttributeExtractor provide(Optional<FlowRequestAttributeConfig> authenticationFlowConfig) {
      final RequestAttributeExtractor extractor = RequestAttributeExtractor.builder()
         .bodyParameterSpec(authenticationFlowConfig.isPresent() ? authenticationFlowConfig.get().getAdditionalAttributes() : Collections.emptyList())
         .headerParameterSpec(Collections.emptyList())
         .build();
      return new FlowRequestAttributeExtractor() {
         @Override
         public ValidationResult validateAttributes(Map<String, String> attributes) {
            return extractor.validateAttributes(attributes, RequestAttributeExtractor.AttributeType.BODY);
         }

         @Override
         public Map<String, String> extractValidAttributes(Map<String, String> attributes) {
            return extractor.extractAllValidAttributes(attributes);
         }
      };
   }

   protected void configure() {
   }
}
