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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.request.Request;
import com.airlock.iam.common.api.domain.model.valueprovider.ValueProvider;
import com.airlock.iam.common.application.configuration.valueprovider.HttpRequestHeaderStringValueProviderConfig;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.annotation.Nullable;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.regex.Pattern;

@LogicForConfig(HttpRequestHeaderStringValueProviderConfig.class)
public final class HttpRequestHeaderStringValueProvider implements ValueProvider<String> {
   private static final ELogger LOG = ELoggerFactory.getLogger(HttpRequestHeaderStringValueProvider.class);
   private final Provider<Request> request;
   private final String headerName;
   private final Pattern allowedHeaderPattern;

   @Inject
   public HttpRequestHeaderStringValueProvider(HttpRequestHeaderStringValueProviderConfig config, Provider<Request> request) {
      this.headerName = config.getHeaderName();
      this.allowedHeaderPattern = config.getAllowedHeaderValuePattern();
      this.request = request;
   }

   @Nullable
   public String getValue() {
      return ((Request)this.request.get()).extractHeaderValue(this.headerName).filter(this::valueMatchesAllowPattern).orElse(null);
   }

   private boolean valueMatchesAllowPattern(String headerValue) {
      if (this.allowedHeaderPattern.asMatchPredicate().test(headerValue)) {
         return true;
      }

      LOG.info(
         String.format(
            "Value of request header was filtered out because it did not match the configured pattern of allowed values: %s",
            this.allowedHeaderPattern.pattern()
         )
      );
      return false;
   }
}
