package com.airlock.iam.transactionapproval.domain.model.selection;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.core.misc.impl.authen.UsedEmailInfo;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.shared.api.domain.service.FlowAttributeService;
import com.airlock.iam.flow.shared.domain.model.attributes.AuthTokenIdAttribute;
import com.airlock.iam.transactionapproval.application.configuration.selection.EmailOtpAuthTokenIdSelectionConditionConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(EmailOtpAuthTokenIdSelectionConditionConfig.class)
public final class EmailOtpAuthTokenIdSelectionCondition implements FlowCondition {
   private final Provider<FlowAttributeService> attributes;
   private final EmailOtpAuthTokenIdSelectionConditionConfig config;

   @Inject
   public EmailOtpAuthTokenIdSelectionCondition(Provider<FlowAttributeService> attributes, EmailOtpAuthTokenIdSelectionConditionConfig config) {
      this.attributes = attributes;
      this.config = config;
   }

   public boolean isFulfilled() {
      Optional<String> authTokenId = this.extractAuthTokenId();
      return authTokenId.isPresent() ? UsedEmailInfo.parse(authTokenId.get()).isPresent() : this.config.isSelectableIfNoAuthTokenIdPresent();
   }

   private Optional<String> extractAuthTokenId() {
      Optional<AuthTokenIdAttribute> autTokenIdAttribute = ((FlowAttributeService)this.attributes.get()).findAttribute(AuthTokenIdAttribute.class);
      return autTokenIdAttribute.isPresent() ? Optional.of(autTokenIdAttribute.get().getAuthTokenId()) : Optional.empty();
   }

   public String displayName() {
      return "Has Email OTP Auth Token ID";
   }
}
