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

import com.airlock.iam.base.api.domain.model.exception.FailureException;
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.authen.mtan.MtanHandlerException;
import com.airlock.iam.core.misc.impl.token.MtanItem;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.shared.application.configuration.condition.MtanCredentialConditionConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;
import java.util.stream.Collectors;

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

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

   @Override
   public boolean isFulfilled() {
      return !this.loadActiveNumbers().isEmpty();
   }

   private List<MtanItem> loadActiveNumbers() {
      return this.loadMtanItemsForUser().stream().filter(t -> t.getMobilePhoneNumber() != null).filter(MtanItem::isActive).collect(Collectors.toList());
   }

   private List<MtanItem> loadMtanItemsForUser() {
      try {
         return this.config.getMtanHandler().getMtanItemsForUser(this.user().getName());
      } catch (MtanHandlerException e) {
         throw new FailureException(e);
      }
   }

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

   @Override
   public String displayName() {
      return "Has mTAN Number";
   }
}
