package com.airlock.iam.publicselfservice.infrastructure.service.delay;

import com.airlock.iam.common.domain.model.user.PrincipalInfo;
import com.airlock.iam.common.infrastructure.delay.ResponseDelayCondition;
import com.airlock.iam.flow.shared.api.domain.service.FlowAttributeService;
import com.airlock.iam.flow.shared.domain.model.session.SuccessfullAuthenticationFactors;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.ws.rs.container.ContainerResponseContext;

public final class UnverifiedUserResponseDelayCondition implements ResponseDelayCondition {
   private final Provider<PrincipalInfo> userInfo;
   private final Provider<FlowAttributeService> attributes;

   @Inject
   public UnverifiedUserResponseDelayCondition(Provider<PrincipalInfo> userInfo, Provider<FlowAttributeService> attributes) {
      this.userInfo = userInfo;
      this.attributes = attributes;
   }

   @Override
   public boolean responseDelayRequired(ContainerResponseContext response) {
      return !this.isUserVerified();
   }

   private boolean isUserVerified() {
      return ((PrincipalInfo)this.userInfo.get()).getAuthenticatedIdentity().isPresent() || this.hasSuccessfulFactorCheck();
   }

   private boolean hasSuccessfulFactorCheck() {
      return ((FlowAttributeService)this.attributes.get())
         .findAttribute(SuccessfullAuthenticationFactors.class)
         .map(factors -> !factors.getFactors().isEmpty())
         .orElse(false);
   }
}
