package com.airlock.iam.common.application.service.request;

import com.airlock.iam.common.domain.model.gateway.HttpRequestClientIpExtractor;
import com.airlock.iam.common.domain.model.gateway.HttpRequestIdExtractor;
import com.airlock.iam.common.domain.model.gateway.HttpRequestMtlsClientCertificateExtractor;
import com.airlock.iam.common.domain.model.gateway.HttpRequestUrlExtractor;
import com.airlock.iam.common.domain.model.request.ClientIp;
import com.airlock.iam.common.domain.model.request.ClientTlsCertificate;
import com.airlock.iam.common.domain.model.request.RequestId;
import com.airlock.iam.common.domain.model.request.RequestUrl;
import com.airlock.iam.common.domain.service.request.HttpHeaderRequestInformationService;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

public final class HttpHeaderRequestInformationServiceImpl implements HttpHeaderRequestInformationService {
   private final Provider<Optional<HttpRequestClientIpExtractor>> clientIpExtractor;
   private final Provider<Optional<HttpRequestIdExtractor>> requestIdExtractor;
   private final Provider<Optional<HttpRequestUrlExtractor>> requestUrlExtractor;
   private final Provider<Optional<HttpRequestMtlsClientCertificateExtractor>> requestMtlsClientCertExtractor;

   @Inject
   public HttpHeaderRequestInformationServiceImpl(
      Provider<Optional<HttpRequestClientIpExtractor>> clientIpExtractor,
      Provider<Optional<HttpRequestIdExtractor>> requestIdExtractor,
      Provider<Optional<HttpRequestUrlExtractor>> requestUrlExtractor,
      Provider<Optional<HttpRequestMtlsClientCertificateExtractor>> requestMtlsClientCertExtractor
   ) {
      this.clientIpExtractor = clientIpExtractor;
      this.requestIdExtractor = requestIdExtractor;
      this.requestUrlExtractor = requestUrlExtractor;
      this.requestMtlsClientCertExtractor = requestMtlsClientCertExtractor;
   }

   @Override
   public Optional<ClientIp> getClientIp() {
      return ((Optional)this.clientIpExtractor.get()).flatMap(HttpRequestClientIpExtractor::getClientIp);
   }

   @Override
   public Optional<RequestUrl> getRequestUrl() {
      return ((Optional)this.requestUrlExtractor.get()).flatMap(HttpRequestUrlExtractor::getRequestUrl);
   }

   @Override
   public Optional<RequestId> getRequestId() {
      return ((Optional)this.requestIdExtractor.get()).flatMap(HttpRequestIdExtractor::getRequestId);
   }

   @Override
   public Optional<ClientTlsCertificate> getMtlsClientCertificate() {
      return ((Optional)this.requestMtlsClientCertExtractor.get()).flatMap(HttpRequestMtlsClientCertificateExtractor::getMtlsClientCertificate);
   }
}
