package com.airlock.iam.common.api.domain.model.claims;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nonnull;
import java.util.Optional;
import lombok.NonNull;

public final class InvalidClaim {
   @NonNull
   private final String claim;
   private final Optional<String> reason;

   public static InvalidClaim invalidClaim(@Nonnull String claim) {
      return new InvalidClaim(claim, Optional.empty());
   }

   public static InvalidClaim invalidClaim(@Nonnull String claim, String reason) {
      return new InvalidClaim(claim, Optional.ofNullable(reason));
   }

   public String getMessage() {
      return "Claim '" + this.claim + "' is invalid" + this.reason.<String>map(r -> ". Reason: " + r).orElse("");
   }

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public String claim() {
      return this.claim;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<String> reason() {
      return this.reason;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "InvalidClaim(claim=" + this.claim() + ", reason=" + this.reason() + ")";
   }

   @SuppressFBWarnings(justification = "generated code")
   private InvalidClaim(@NonNull String claim, Optional<String> reason) {
      if (claim == null) {
         throw new NullPointerException("claim is marked non-null but is null");
      }

      this.claim = claim;
      this.reason = reason;
   }
}
