package com.airlock.iam.common.infrastructure.request;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.application.configuration.gateway.extractor.RequestUrlExtractorConfig;
import com.airlock.iam.common.domain.model.gateway.HttpRequestUrlExtractor;
import com.airlock.iam.common.domain.model.request.RequestUrl;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.servlet.http.HttpServletRequest;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.util.Optional;

@LogicForConfig(RequestUrlExtractorConfig.class)
public final class HttpRequestUrlExtractorImpl implements HttpRequestUrlExtractor {
   private static final ELogger LOG = ELoggerFactory.getLogger(HttpRequestUrlExtractorImpl.class);
   private final RequestUrlExtractorConfig config;
   private final Provider<HttpServletRequest> request;

   @Inject
   public HttpRequestUrlExtractorImpl(RequestUrlExtractorConfig config, Provider<HttpServletRequest> request) {
      this.request = request;
      this.config = config;
   }

   @Override
   public Optional<RequestUrl> getRequestUrl() {
      String headerName = this.config.getHttpHeaderName();
      return Optional.ofNullable(((HttpServletRequest)this.request.get()).getHeader(headerName)).map(String::trim).flatMap(value -> {
         try {
            return Optional.of(new RequestUrl(value));
         } catch (URISyntaxException | MalformedURLException e) {
            LOG.debug(String.format("Failed to parse URL %s from header %s", LogUtil.logSafeQuote(value), headerName));
            return Optional.empty();
         }
      });
   }
}
