package com.airlock.iam.authentication.infrastructure.idpropagation;

import com.airlock.iam.authentication.domain.model.idpropagation.Saml2SsoContinueUriPropagation;
import com.airlock.iam.authentication.domain.model.idpropagation.TargetUriToPropagate;
import com.airlock.iam.common.domain.model.request.ContextPath;
import com.airlock.iam.login.api.domain.model.location.propagate.URIPropagation;
import com.airlock.iam.saml2.domain.model.idp.Saml2IdpMetaAlias;
import com.airlock.iam.saml2.domain.model.idp.Saml2IdpSsoContinuationId;
import com.airlock.iam.saml2.domain.model.idp.Saml2RequestId;
import com.airlock.iam.saml2.infrastructure.idp.Saml2IdpJerseyUrls;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.ws.rs.core.UriBuilder;
import java.net.URI;

public final class Saml2SsoContinueUriPropagationImpl implements Saml2SsoContinueUriPropagation {
   private final Provider<TargetUriToPropagate> uriToPropagate;
   private final Provider<URIPropagation> uriPropagation;
   private final Provider<ContextPath> contextPath;

   @Inject
   Saml2SsoContinueUriPropagationImpl(Provider<TargetUriToPropagate> uriToPropagate, Provider<URIPropagation> uriPropagation, Provider<ContextPath> contextPath) {
      this.uriToPropagate = uriToPropagate;
      this.uriPropagation = uriPropagation;
      this.contextPath = contextPath;
   }

   @Override
   public URI idpInitiatedPropagate(Saml2IdpSsoContinuationId identityPropagationId) {
      URI propagatedURI = this.getUriBuilder(identityPropagationId).build(new Object[0]);
      ((TargetUriToPropagate)this.uriToPropagate.get()).setTargetUri(propagatedURI);
      ((URIPropagation)this.uriPropagation.get()).propagate(propagatedURI);
      return propagatedURI;
   }

   @Override
   public URI spInitiatedPropagate(Saml2IdpSsoContinuationId identityPropagationId, Saml2RequestId requestId, Saml2IdpMetaAlias metaAlias) {
      URI propagatedURI = this.getUriBuilder(identityPropagationId)
         .queryParam("metaAlias", new Object[]{metaAlias})
         .queryParam("ReqID", new Object[]{requestId})
         .build(new Object[0]);
      ((TargetUriToPropagate)this.uriToPropagate.get()).setTargetUri(propagatedURI);
      ((URIPropagation)this.uriPropagation.get()).propagate(propagatedURI);
      return propagatedURI;
   }

   private UriBuilder getUriBuilder(Saml2IdpSsoContinuationId identityPropagationId) {
      return UriBuilder.fromUri(((ContextPath)this.contextPath.get()).getPath())
         .path(Saml2IdpJerseyUrls.SSO_CONTINUE_URI.path())
         .queryParam("id", new Object[]{identityPropagationId.value()});
   }
}
