package com.airlock.iam.saml2.infrastructure.service.idp;

import com.airlock.iam.openfedlib.saml2.state.Saml2DataMapProvider;
import com.airlock.iam.saml2.domain.model.Saml2RelayState;
import com.airlock.iam.saml2.domain.model.idp.Saml2FederationSessionIndex;
import com.airlock.iam.saml2.domain.model.idp.Saml2RequestId;
import com.airlock.iam.saml2.domain.service.Saml2LibraryIdpCacheService;
import com.sun.identity.saml2.profile.IDPCache;
import com.sun.identity.saml2.protocol.AuthnRequest;
import jakarta.inject.Inject;
import java.util.Optional;

public final class Saml2LibraryIdpCacheServiceImpl implements Saml2LibraryIdpCacheService {
   @Inject
   private Saml2LibraryIdpCacheServiceImpl() {
   }

   @Override
   public Optional<AuthnRequest> getAuthnRequestByRequestId(Saml2RequestId requestId) {
      return Optional.ofNullable(IDPCache.authnRequestCache().get(requestId.value()));
   }

   @Override
   public boolean isSessionIndexCached(Saml2FederationSessionIndex sessionIndex) {
      return IDPCache.idpSessionsByIndices().contains(sessionIndex.value());
   }

   @Override
   public void removeCachedAuthnContext(Saml2RequestId requestId) {
      synchronized (Saml2DataMapProvider.DataMapId.IDP_IDP_AUTHN_CONTEXT_CACHE) {
         IDPCache.idpAuthnContextCache().remove(requestId.value());
      }
   }

   @Override
   public Optional<Saml2RelayState> resolveAndRemoveRelayStateFromCache(Saml2RelayState relayState) {
      return Optional.ofNullable(IDPCache.relayStateCache().remove(relayState.value())).map(Saml2RelayState::relayState);
   }
}
