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

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.user.UserIdentity;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.publicselfservice.api.domain.model.PublicSelfServiceRestriction;
import com.airlock.iam.publicselfservice.api.domain.model.PublicSelfServiceUser;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

public final class RestrictionViolationsService {
   private static final ELogger LOG = ELoggerFactory.getLogger(RestrictionViolationsService.class);
   private final Provider<PublicSelfServiceUserFactory> userFactory;

   @Inject
   public RestrictionViolationsService(Provider<PublicSelfServiceUserFactory> userFactory) {
      this.userFactory = userFactory;
   }

   public Optional<PublicSelfServiceRestriction.ViolationCode> checkViolations(UserIdentity identity) {
      PublicSelfServiceUser user = ((PublicSelfServiceUserFactory)this.userFactory.get()).createPublicSelfServiceUser(identity);
      Optional<PublicSelfServiceRestriction.ViolationCode> violationToReport = user.getViolationToReport();
      if (violationToReport.isPresent()) {
         LOG.info("Rejecting user identification because of a public self-service restriction violation: " + violationToReport.get().name());
      }

      if (user.getViolationIfPresent().isPresent()) {
         LOG.info(
            "Public self-service restriction violation ("
               + user.getViolationIfPresent().get().name()
               + ") during user identification but continuing in stealth mode."
         );
      } else {
         LOG.info("User identified as " + LogUtil.logSafeQuote(user.getIdentity().id()));
      }

      return violationToReport;
   }
}
