package com.airlock.iam.flow.shared.domain.model.condition;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.user.User;
import com.airlock.iam.core.misc.impl.tokenverifier.vasco.VascoTokenVerifier;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.shared.application.configuration.condition.VascoOtpCredentialConditionConfig;
import com.airlock.iam.plugin.framework.application.service.builder.plugin.PluginPropertyBuilderInitializer;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

@LogicForConfig(VascoOtpCredentialConditionConfig.class)
public class VascoOtpCredentialCondition implements FlowCondition {
   private final Provider<User> user;
   private final VascoOtpCredentialConditionConfig config;

   @Inject
   public VascoOtpCredentialCondition(Provider<User> user, VascoOtpCredentialConditionConfig config) {
      this.user = user;
      this.config = config;
   }

   @Override
   public boolean isFulfilled() {
      return this.vascoTokenVerifier().hasToken(this.user().getName());
   }

   private VascoTokenVerifier vascoTokenVerifier() {
      return ((VascoTokenVerifier.VascoTokenVerifierBuilder)PluginPropertyBuilderInitializer.pluginBuilder(VascoTokenVerifier.VascoTokenVerifierBuilder.class))
         .tokenDataProvider(this.config.getTokenDataProvider())
         .build();
   }

   private User user() {
      return (User)this.user.get();
   }

   @Override
   public String displayName() {
      return "Has Vasco OTP Token";
   }
}
