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

import com.airlock.iam.authentication.api.domain.model.step.AuthenticationFlowStep;
import com.airlock.iam.authentication.api.domain.model.step.IdentityProvidingFlowStep;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapificationUtils;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.flow.api.domain.model.step.StepAction;
import com.airlock.iam.flow.api.domain.model.step.StepError;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.api.domain.model.step.StepResultData;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.time.Instant;
import java.util.Date;

public interface DeviceTokenVerificationStep extends AuthenticationFlowStep, IdentityProvidingFlowStep {
   StepResult checkResponseJwt(String var1);

   StepResult getChallenge(String var1);

   final class DeviceTokenStepChallenge implements StepResultData {
      private static final String CHALLENGE_KEY = "challenge";
      private static final String VALID_TO_KEY = "validTo";
      private final String challenge;
      private final Date validTo;

      public static DeviceTokenVerificationStep.DeviceTokenStepChallenge deviceTokenChallenge(String challenge, Instant validTo) {
         return new DeviceTokenVerificationStep.DeviceTokenStepChallenge(challenge, Date.from(validTo));
      }

      @Override
      public MapifiedValues mapify() {
         return MapifiedValuesBuilder.mapifiedValues().put("challenge", this.challenge).put("validTo", MapificationUtils.mapifyDate(this.validTo)).build();
      }

      public static DeviceTokenVerificationStep.DeviceTokenStepChallenge demapify(MapifiedValues values) {
         return new DeviceTokenVerificationStep.DeviceTokenStepChallenge(
            values.get("challenge"), values.demapifyValue("validTo", MapificationUtils::demapifyDate)
         );
      }

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

      @SuppressFBWarnings(justification = "generated code")
      public Date getValidTo() {
         return this.validTo;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DeviceTokenStepChallenge(String challenge, Date validTo) {
         this.challenge = challenge;
         this.validTo = validTo;
      }

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

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

   enum DeviceTokenVerificationStepActions implements StepAction {
      DEVICE_TOKEN_RESPONSE_REQUIRED;
   }

   enum DeviceTokenVerificationStepErrors implements StepError {
      DEVICE_TOKEN_VERIFICATION_FAILED;
   }
}
