package com.airlock.iam.base.api.domain.model.email;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import jakarta.mail.internet.AddressException;
import jakarta.mail.internet.InternetAddress;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

public final class EmailAddress {
   private final InternetAddress address;

   private EmailAddress(InternetAddress address) {
      this.address = address;
   }

   public String value() {
      return this.address.getAddress();
   }

   private static Optional<InternetAddress> validAddress(@Nullable String inputAddress) {
      if (StringUtils.isBlank(inputAddress)) {
         return Optional.empty();
      }

      try {
         return Optional.of(new InternetAddress(inputAddress, true));
      } catch (AddressException e) {
         return Optional.empty();
      }
   }

   public static Optional<EmailAddress> emailAddress(@Nullable String emailAddress) {
      return validAddress(emailAddress).map(EmailAddress::new);
   }

   public static boolean isValidAddress(@Nullable String emailAddress) {
      return validAddress(emailAddress).isPresent();
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean equals(Object o) {
      if (o == this) {
         return true;
      } else if (!(o instanceof EmailAddress other)) {
         return false;
      } else {
         Object this$address = this.address;
         Object other$address = other.address;
         return this$address == null ? other$address == null : this$address.equals(other$address);
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public int hashCode() {
      int PRIME = 59;
      int result = 1;
      Object $address = this.address;
      return result * 59 + ($address == null ? 43 : $address.hashCode());
   }
}
