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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.common.domain.model.principal.UserPrincipal;
import com.airlock.iam.publicselfservice.api.domain.model.PublicSelfServiceRestriction;
import com.airlock.iam.publicselfservice.application.configuration.restrictions.InvalidUserRestrictionConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(InvalidUserRestrictionConfig.class)
public class InvalidUserRestriction implements PublicSelfServiceRestriction {
   private final Provider<InvalidUserRestrictionConfig> config;
   private final Provider<UserPrincipal> userPrincipal;

   @Inject
   public InvalidUserRestriction(Provider<InvalidUserRestrictionConfig> config, Provider<UserPrincipal> userPrincipal) {
      this.config = config;
      this.userPrincipal = userPrincipal;
   }

   @Override
   public Optional<PublicSelfServiceRestriction.RestrictionViolation> getViolation() {
      if (!((UserPrincipal)this.userPrincipal.get()).exists()) {
         return Optional.empty();
      }

      PersistentUser user = ((UserPrincipal)this.userPrincipal.get()).user();
      return !user.getUserValidity().isValid()
         ? Optional.of(
            new PublicSelfServiceRestriction.RestrictionViolation(
               InvalidUserRestriction.InvalidUserRestrictionCode.USER_INVALID, ((InvalidUserRestrictionConfig)this.config.get()).isEnableFeedback()
            )
         )
         : Optional.empty();
   }

   public enum InvalidUserRestrictionCode implements PublicSelfServiceRestriction.ViolationCode {
      USER_INVALID;
   }
}
