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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.factor.domain.model.fido.FidoAuthTokenId;
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.FidoAuthTokenIdSelectionConditionConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

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

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

   public boolean isFulfilled() {
      Optional<String> authTokenId = this.extractAuthTokenId();
      return authTokenId.isPresent() ? FidoAuthTokenId.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 FIDO Auth Token ID";
   }
}
