package com.airlock.iam.authentication.domain.model.migration.condition;

import com.airlock.iam.authentication.application.configuration.migration.condition.NextAuthMethodBasedMigrationConditionConfig;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.common.domain.model.principal.UserPrincipal;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.time.Duration;

@LogicForConfig(NextAuthMethodBasedMigrationConditionConfig.class)
public class NextAuthMethodBasedMigrationCondition implements FlowCondition {
   private final Provider<UserPrincipal> principal;
   private final NextAuthMethodBasedMigrationConditionConfig config;

   @Inject
   public NextAuthMethodBasedMigrationCondition(NextAuthMethodBasedMigrationConditionConfig config, Provider<UserPrincipal> principal) {
      this.config = config;
      this.principal = principal;
   }

   @Override
   public boolean isFulfilled() {
      PersistentUser user = ((UserPrincipal)this.principal.get()).user();
      Duration hintPeriodDuration = this.config.getHintPeriodDuration();
      return this.isNextAuthMethodSupported(user, this.config.getTargetAuthMethod())
         && HintPeriodHelper.isUserWithinMigrationHintPeriod(user, hintPeriodDuration);
   }

   private boolean isNextAuthMethodSupported(PersistentUser user, String targetAuthMethod) {
      return !this.config.isMigrationToSameAuthMethodAllowed() && targetAuthMethod.equals(user.getAuthMethod())
         ? false
         : user.getMultipleNextAuthMethods().contains(targetAuthMethod);
   }

   @Override
   public String displayName() {
      return "Migration to " + LogUtil.quote(this.config.getTargetAuthMethod());
   }
}
