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

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.cronto.CrontoHandler;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.api.domain.model.tag.CurrentFlowTags;
import com.airlock.iam.flow.api.domain.model.tag.TagName;
import com.airlock.iam.flow.shared.application.configuration.cronto.CrontoActivationPossibleConditionConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(CrontoActivationPossibleConditionConfig.class)
public class CrontoActivationPossibleCondition implements FlowCondition {
   private final Provider<User> user;
   private final Provider<CurrentFlowTags> currentTags;
   private final CrontoHandler crontoHandler;
   private final Optional<TagName> strongAuthTagName;

   @Inject
   public CrontoActivationPossibleCondition(
      Provider<User> user, Provider<CurrentFlowTags> currentTags, CrontoHandler crontoHandler, Optional<TagName> strongAuthTagName
   ) {
      this.user = user;
      this.currentTags = currentTags;
      this.crontoHandler = crontoHandler;
      this.strongAuthTagName = strongAuthTagName;
   }

   @Override
   public boolean isFulfilled() {
      CrontoHandler.CrontoSelfRegistrationContext context = this.isUserStronglyAuthenticated()
         ? CrontoHandler.CrontoSelfRegistrationContext.MIGRATION
         : CrontoHandler.CrontoSelfRegistrationContext.INITIAL_REGISTRATION;
      return this.crontoHandler.canActivateDevice(this.user().getId(), context);
   }

   private boolean isUserStronglyAuthenticated() {
      return this.strongAuthTagName.isEmpty() ? false : ((CurrentFlowTags)this.currentTags.get()).checkTagPresent(this.strongAuthTagName.get());
   }

   @Override
   public String displayName() {
      return "Cronto Activation Possible";
   }

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