package com.airlock.iam.factor.domain.model.airlock2fa;

import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceId;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public interface ImmediateAuthenticationAnswer {
   ImmediateAuthenticationAnswer.ImmediateAuthenticationResult getResult();

   Optional<AuthenticationStatus> getKnownStatus();

   Optional<Airlock2FADeviceId> getDeviceId();

   final class ImmediateAuthenticationAnswerImpl implements ImmediateAuthenticationAnswer {
      private final ImmediateAuthenticationAnswer.ImmediateAuthenticationResult result;
      private final Optional<AuthenticationStatus> knownStatus;
      private final Optional<Airlock2FADeviceId> deviceId;

      public static ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl immediateAuthenticationAnswer(
         ImmediateAuthenticationAnswer.ImmediateAuthenticationResult result
      ) {
         return new ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl(result, Optional.empty(), Optional.empty());
      }

      public static ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl immediateAuthenticationAnswer(
         ImmediateAuthenticationAnswer.ImmediateAuthenticationResult result, Airlock2FADeviceId deviceId
      ) {
         return new ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl(result, Optional.empty(), Optional.of(deviceId));
      }

      public static ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl immediateAuthenticationAnswer(
         ImmediateAuthenticationAnswer.ImmediateAuthenticationResult result, AuthenticationStatus status
      ) {
         return new ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl(result, Optional.of(status), Optional.empty());
      }

      public static ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl immediateAuthenticationAnswer(
         ImmediateAuthenticationAnswer.ImmediateAuthenticationResult result, AuthenticationStatus status, Airlock2FADeviceId deviceId
      ) {
         return new ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl(result, Optional.of(status), Optional.of(deviceId));
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public ImmediateAuthenticationAnswer.ImmediateAuthenticationResult getResult() {
         return this.result;
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public Optional<AuthenticationStatus> getKnownStatus() {
         return this.knownStatus;
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public Optional<Airlock2FADeviceId> getDeviceId() {
         return this.deviceId;
      }

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

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ImmediateAuthenticationAnswer.ImmediateAuthenticationAnswerImpl(result="
            + this.getResult()
            + ", knownStatus="
            + this.getKnownStatus()
            + ", deviceId="
            + this.getDeviceId()
            + ")";
      }

      @SuppressFBWarnings(justification = "generated code")
      private ImmediateAuthenticationAnswerImpl(
         ImmediateAuthenticationAnswer.ImmediateAuthenticationResult result, Optional<AuthenticationStatus> knownStatus, Optional<Airlock2FADeviceId> deviceId
      ) {
         this.result = result;
         this.knownStatus = knownStatus;
         this.deviceId = deviceId;
      }
   }

   enum ImmediateAuthenticationResult {
      ALLOW("allow"),
      DENY("deny");

      private final String value;

      @SuppressFBWarnings(justification = "generated code")
      ImmediateAuthenticationResult(final String value) {
         this.value = value;
      }

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