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

import com.airlock.iam.base.api.domain.model.email.EmailAddress;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.domain.model.email.EmailAddressResolver;
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.NoEmailAddressRestrictionConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(NoEmailAddressRestrictionConfig.class)
public class NoEmailAddressRestriction implements PublicSelfServiceRestriction {
   private final Provider<UserPrincipal> userPrincipal;
   private final NoEmailAddressRestrictionConfig settings;

   @Inject
   public NoEmailAddressRestriction(Provider<UserPrincipal> userPrincipal, NoEmailAddressRestrictionConfig settings) {
      this.userPrincipal = userPrincipal;
      this.settings = settings;
   }

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

   private Optional<EmailAddress> emailAddress() {
      return EmailAddressResolver.resolveEmailAddress(
         this.settings.getEmailContextData(),
         ((UserPrincipal)this.userPrincipal.get()).user().getContextData(),
         ((UserPrincipal)this.userPrincipal.get()).getName()
      );
   }

   public enum NoEmailAddressRestrictionCode implements PublicSelfServiceRestriction.ViolationCode {
      NO_EMAIL_ADDRESS;
   }
}
