package com.airlock.iam.publicselfservice.domain.service.restrictions;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.domain.model.principal.UserPrincipal;
import com.airlock.iam.core.misc.impl.token.MtanItem;
import com.airlock.iam.publicselfservice.api.domain.model.PublicSelfServiceRestriction;
import com.airlock.iam.publicselfservice.application.configuration.restrictions.NoMtanTokenRestrictionConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(NoMtanTokenRestrictionConfig.class)
public class NoMtanTokenRestriction implements PublicSelfServiceRestriction {
   private final Provider<Optional<MtanItem>> mtanItem;
   private final Provider<UserPrincipal> userPrincipal;

   @Inject
   public NoMtanTokenRestriction(Provider<Optional<MtanItem>> mtanItem, Provider<UserPrincipal> userPrincipal) {
      this.mtanItem = mtanItem;
      this.userPrincipal = userPrincipal;
   }

   @Override
   public Optional<PublicSelfServiceRestriction.RestrictionViolation> getViolation() {
      if (!((UserPrincipal)this.userPrincipal.get()).exists()) {
         return Optional.empty();
      } else {
         return ((Optional)this.mtanItem.get()).isEmpty()
            ? Optional.of(new PublicSelfServiceRestriction.RestrictionViolation(NoMtanTokenRestriction.NoMtanTokenRestrictionCode.NO_MTAN_TOKEN, true))
            : Optional.empty();
      }
   }

   public enum NoMtanTokenRestrictionCode implements PublicSelfServiceRestriction.ViolationCode {
      NO_MTAN_TOKEN;
   }
}
