package com.airlock.iam.flow.shared.domain.model.rememberme;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.time.Duration;
import java.util.Optional;
import lombok.NonNull;
import org.apache.commons.lang3.Validate;

public final class RememberMeTokenLifetime {
   @NonNull
   private final Duration lifetime;
   @NonNull
   private final Optional<Duration> idleLifetime;

   private RememberMeTokenLifetime(@NonNull Duration lifetime, @NonNull Optional<Duration> idleLifetime) {
      if (lifetime == null) {
         throw new NullPointerException("lifetime is marked non-null but is null");
      }

      if (idleLifetime == null) {
         throw new NullPointerException("idleLifetime is marked non-null but is null");
      }

      validateNonNegative(lifetime);
      idleLifetime.ifPresent(RememberMeTokenLifetime::validateNonNegative);
      this.lifetime = lifetime;
      this.idleLifetime = idleLifetime;
   }

   public static RememberMeTokenLifetime lifetime(Duration lifetime) {
      return new RememberMeTokenLifetime(lifetime, Optional.empty());
   }

   public static RememberMeTokenLifetime lifetime(Duration lifetime, Duration idleLifetime) {
      return new RememberMeTokenLifetime(lifetime, Optional.of(idleLifetime));
   }

   public static RememberMeTokenLifetime lifetime(Duration lifetime, Optional<Duration> idleLifetime) {
      return idleLifetime.<RememberMeTokenLifetime>map(idleDuration -> lifetime(lifetime, idleDuration)).orElse(lifetime(lifetime));
   }

   private static void validateNonNegative(Duration d) {
      Validate.isTrue(!d.isNegative());
   }

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

   @NonNull
   @SuppressFBWarnings(justification = "generated code")
   public Optional<Duration> idleLifetime() {
      return this.idleLifetime;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "RememberMeTokenLifetime(lifetime=" + this.lifetime() + ", idleLifetime=" + this.idleLifetime() + ")";
   }
}
