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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.domain.service.uri.UrlUtils;
import com.airlock.iam.common.application.configuration.sso.SsoHeaderTicketExtractorConfig;
import com.airlock.iam.common.domain.model.transform.TransformationProcessor;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(SsoHeaderTicketExtractorConfig.class)
public class SsoHeaderTicketExtractorImpl implements SsoTicketExtractor {
   private final Provider<Optional<String>> headerValue;
   private final Provider<SsoHeaderTicketExtractorConfig> config;
   private final Provider<TransformationProcessor<String>> stringTransformationProcessor;

   @Inject
   public SsoHeaderTicketExtractorImpl(
      Provider<Optional<String>> headerValue,
      Provider<SsoHeaderTicketExtractorConfig> config,
      Provider<TransformationProcessor<String>> stringTransformationProcessor
   ) {
      this.headerValue = headerValue;
      this.config = config;
      this.stringTransformationProcessor = stringTransformationProcessor;
   }

   @Override
   public Optional<String> extract() {
      return ((Optional)this.headerValue.get())
         .<String>map(value -> ((SsoHeaderTicketExtractorConfig)this.config.get()).urlDecodeValue() ? UrlUtils.urlDecode(value) : value)
         .flatMap(((TransformationProcessor)this.stringTransformationProcessor.get())::transform);
   }
}
