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

import com.airlock.iam.saml2.domain.model.Saml2RelayState;
import com.airlock.iam.saml2.domain.model.Saml2Signature;
import com.airlock.iam.saml2.domain.model.Saml2SignatureAlgorithm;
import com.airlock.iam.saml2.domain.model.idp.Saml2RequestParameter;
import com.airlock.iam.saml2.domain.model.idp.Saml2ResponseParameter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

public final class Saml2Request extends HttpServletRequestWrapper {
   public Saml2Request(HttpServletRequest request) {
      super(request);
   }

   public Optional<Saml2RelayState> relayStateParameter() {
      return this.extractNonBlankParameter("RelayState").map(Saml2RelayState::relayState);
   }

   public Optional<Saml2ResponseParameter> samlResponse() {
      return this.extractNonBlankParameter("SAMLResponse").map(Saml2ResponseParameter::samlResponse);
   }

   public Optional<Saml2RequestParameter> samlRequest() {
      return this.extractNonBlankParameter("SAMLRequest").map(Saml2RequestParameter::samlRequest);
   }

   public Optional<Saml2SignatureAlgorithm> signatureAlgorithmParameter() {
      return this.extractNonBlankParameter("SigAlg").map(Saml2SignatureAlgorithm::signatureAlgorithm);
   }

   public Optional<Saml2Signature> signatureParameter() {
      return this.extractNonBlankParameter("Signature").map(Saml2Signature::signature);
   }

   private Optional<String> extractNonBlankParameter(String parameterName) {
      return Optional.ofNullable(this.getParameter(parameterName)).filter(StringUtils::isNotBlank);
   }
}
