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

import com.airlock.iam.factor.domain.model.airlock2fa.DeferredAuthenticationAnswer;
import com.airlock.iam.factor.domain.model.airlock2fa.ImmediateAuthenticationAnswer;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public class SessionBasedAuthenticationAnswer<D extends DeferredAuthenticationAnswer> {
   private final Optional<ImmediateAuthenticationAnswer> immediate;
   private final Optional<D> deferred;

   public SessionBasedAuthenticationAnswer(ImmediateAuthenticationAnswer immediate) {
      this.immediate = Optional.of(immediate);
      this.deferred = Optional.empty();
   }

   public SessionBasedAuthenticationAnswer(D deferred) {
      this.immediate = Optional.empty();
      this.deferred = Optional.of(deferred);
   }

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

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

   public static final class MobileOnlyAuthenticationAnswer
      extends SessionBasedAuthenticationAnswer<DeferredAuthenticationAnswer.MobileOnlyDeferredAuthenticationAnswer> {
      public MobileOnlyAuthenticationAnswer(ImmediateAuthenticationAnswer immediateAnswer) {
         super(immediateAnswer);
      }

      public MobileOnlyAuthenticationAnswer(DeferredAuthenticationAnswer.MobileOnlyDeferredAuthenticationAnswer deferredAnswer) {
         super(deferredAnswer);
      }
   }

   public static final class OfflineQrCodeAuthenticationAnswer
      extends SessionBasedAuthenticationAnswer<DeferredAuthenticationAnswer.OfflineQrCodeDeferredAuthenticationAnswer> {
      public OfflineQrCodeAuthenticationAnswer(ImmediateAuthenticationAnswer immediateAnswer) {
         super(immediateAnswer);
      }

      public OfflineQrCodeAuthenticationAnswer(DeferredAuthenticationAnswer.OfflineQrCodeDeferredAuthenticationAnswer deferredAnswer) {
         super(deferredAnswer);
      }
   }

   public static final class OneTouchAuthenticationAnswer
      extends SessionBasedAuthenticationAnswer<DeferredAuthenticationAnswer.OneTouchDeferredAuthenticationAnswer> {
      public OneTouchAuthenticationAnswer(ImmediateAuthenticationAnswer immediateAnswer) {
         super(immediateAnswer);
      }

      public OneTouchAuthenticationAnswer(DeferredAuthenticationAnswer.OneTouchDeferredAuthenticationAnswer deferredAnswer) {
         super(deferredAnswer);
      }
   }

   public static final class OnlineQrCodeAuthenticationAnswer
      extends SessionBasedAuthenticationAnswer<DeferredAuthenticationAnswer.OnlineQrCodeDeferredAuthenticationAnswer> {
      public OnlineQrCodeAuthenticationAnswer(ImmediateAuthenticationAnswer immediateAnswer) {
         super(immediateAnswer);
      }

      public OnlineQrCodeAuthenticationAnswer(DeferredAuthenticationAnswer.OnlineQrCodeDeferredAuthenticationAnswer deferredAnswer) {
         super(deferredAnswer);
      }
   }
}
