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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.application.configuration.gateway.extractor.RequestIdExtractorConfig;
import com.airlock.iam.common.domain.model.gateway.HttpRequestIdExtractor;
import com.airlock.iam.common.domain.model.request.RequestId;
import com.airlock.iam.elog.api.EDefaultLogType;
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.util.Optional;

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

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

   @Override
   public Optional<RequestId> getRequestId() {
      return Optional.ofNullable(((HttpServletRequest)this.request.get()).getHeader(this.config.getHttpHeaderName()))
         .filter(HttpRequestIdExtractorImpl::validateRequestID)
         .map(RequestId::new);
   }

   private static boolean validateRequestID(String requestId) {
      if (!RequestId.isValidRequestId(requestId)) {
         LOG.warn(EDefaultLogType.GENERIC_LOG_TYPE, "Invalid request id in header; ignoring");
         return false;
      } else {
         return true;
      }
   }
}
