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

import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FAAccountId;
import com.airlock.iam.base.misc.result.Result;
import com.airlock.iam.factor.domain.model.airlock2fa.Airlock2FAAuthDevice;
import com.airlock.iam.factor.domain.model.airlock2fa.Airlock2FAMobileOnlyRedirectUri;
import com.airlock.iam.factor.domain.model.airlock2fa.Airlock2FASessionId;
import com.airlock.iam.factor.domain.model.airlock2fa.ImmediateAuthenticationAnswer;
import com.airlock.iam.factor.domain.model.airlock2fa.MobileOnlyMessageApprovalAnswer;
import com.airlock.iam.factor.domain.model.airlock2fa.OfflineQrCodeMessageApprovalAnswer;
import com.airlock.iam.factor.domain.model.airlock2fa.OneTouchAndOfflineQrCodeMessageApprovalAnswer;
import com.airlock.iam.factor.domain.model.airlock2fa.OneTouchMessageApprovalAnswer;
import com.airlock.iam.factor.domain.model.airlock2fa.OnlineQrCodeMessageApprovalAnswer;
import com.airlock.iam.factor.domain.model.airlock2fa.futurae.Airlock2FAFuturaeAuthSession;
import com.airlock.iam.factor.domain.model.airlock2fa.futurae.FuturaeErrorResponseException;
import com.airlock.iam.factor.domain.model.airlock2fa.otp.Airlock2FAOtp;
import com.airlock.iam.factor.domain.model.airlock2fa.otp.Airlock2FAPasscode;
import com.airlock.iam.factor.domain.model.airlock2fa.qrcode.Airlock2FAExchangeTokensAnswer;
import com.airlock.iam.factor.domain.model.airlock2fa.qrcode.Airlock2FAQrCodeImage;
import com.airlock.iam.factor.domain.model.airlock2fa.qrcode.Airlock2FAQrCodeUrl;
import com.airlock.iam.flow.shared.api.domain.model.message.Airlock2FAMessage;
import java.time.Duration;
import java.util.Optional;

public interface Airlock2FAApprovalService extends Airlock2FAPreAuthenticationService {
   OneTouchAndOfflineQrCodeMessageApprovalAnswer approveWithOneTouchAndOfflineQrCode(
      Airlock2FAAccountId var1, Airlock2FAAuthDevice var2, Airlock2FAMessage var3
   );

   OneTouchMessageApprovalAnswer approveWithOneTouch(Airlock2FAAccountId var1, Airlock2FAAuthDevice var2, Airlock2FAMessage var3);

   OneTouchMessageApprovalAnswer approveWithPushToAll(Airlock2FAAccountId var1, Airlock2FAMessage var2);

   OfflineQrCodeMessageApprovalAnswer approveWithOfflineQrCode(Airlock2FAAccountId var1, Airlock2FAAuthDevice var2, Airlock2FAMessage var3);

   OnlineQrCodeMessageApprovalAnswer approveWithOnlineQrCode(
      Airlock2FAAccountId var1, Optional<Airlock2FAMobileOnlyRedirectUri> var2, Airlock2FAMessage var3, Optional<Duration> var4
   );

   MobileOnlyMessageApprovalAnswer approveWithMobileOnly(Airlock2FAAccountId var1, Optional<Airlock2FAMobileOnlyRedirectUri> var2, Airlock2FAMessage var3);

   Airlock2FAAuthenticationService.AuthenticationStatusAnswer checkTransactionAuthenticationStatus(Airlock2FAFuturaeAuthSession var1);

   Result<ImmediateAuthenticationAnswer, FuturaeErrorResponseException> abortTransaction(Airlock2FAAccountId var1, Airlock2FASessionId var2);

   Airlock2FAQrCodeImage retrieveOfflineQrCodeImage(Airlock2FAAccountId var1, Airlock2FAQrCodeUrl var2);

   Result<Airlock2FAAuthenticationService.ValidateOfflineQrCodeAnswer, FuturaeErrorResponseException> validateOfflineQrCode(
      Airlock2FAAccountId var1, Airlock2FASessionId var2, Airlock2FAOtp var3
   );

   ImmediateAuthenticationAnswer approveWithPasscode(Airlock2FAAccountId var1, Airlock2FAPasscode var2);

   Airlock2FAExchangeTokensAnswer fetchAuthenticationExchangeTokens(
      Airlock2FAAccountId var1, Airlock2FASessionId var2, Duration var3, int var4, String var5, String var6
   );
}
