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.SsoCookieTicketExtractorConfig;
import com.airlock.iam.common.domain.model.transform.TransformationProcessor;
import com.airlock.iam.core.misc.util.ServletUtils;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Optional;

@LogicForConfig(SsoCookieTicketExtractorConfig.class)
public class SsoCookieTicketExtractorImpl implements SsoTicketExtractor {
   private final Provider<HttpServletRequest> request;
   private final Provider<SsoCookieTicketExtractorConfig> config;
   private final Provider<TransformationProcessor<String>> stringTransformationProcessor;

   @Inject
   public SsoCookieTicketExtractorImpl(
      Provider<HttpServletRequest> request,
      Provider<SsoCookieTicketExtractorConfig> config,
      Provider<TransformationProcessor<String>> stringTransformationProcessor
   ) {
      this.request = request;
      this.config = config;
      this.stringTransformationProcessor = stringTransformationProcessor;
   }

   @Override
   public Optional<String> extract() {
      return ServletUtils.tryGetCookie((HttpServletRequest)this.request.get(), ((SsoCookieTicketExtractorConfig)this.config.get()).getCookieName())
         .<String>map(Cookie::getValue)
         .map(value -> ((SsoCookieTicketExtractorConfig)this.config.get()).isUrlDecodeValue() ? UrlUtils.urlDecode(value) : value)
         .flatMap(((TransformationProcessor)this.stringTransformationProcessor.get())::transform);
   }
}
