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

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.core.domain.model.cronto.challenge.CrontoActivation1Challenge;
import com.airlock.iam.core.misc.impl.cronto.CrontoActivationSession;
import com.airlock.iam.flow.api.domain.model.step.StepSession;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public final class CrontoActivationStepSession implements StepSession {
   private static final String ON_SCREEN_KEY = "onScreen";
   private static final String SESSION_KEY = "session";
   private static final String CHALLENGE_KEY = "challenge";
   private final boolean isOnScreenActivation;
   private Optional<CrontoActivationSession> activationSession = Optional.empty();
   private Optional<CrontoActivationChallenge> activationChallenge = Optional.empty();

   public CrontoActivationStepSession(boolean isOnScreenActivation) {
      this.isOnScreenActivation = isOnScreenActivation;
   }

   public boolean isFirstChallengeCompleted() {
      return this.activationSession.isPresent() && this.activationSession.get().isResponse1Valid();
   }

   public CrontoActivation1Challenge getFirstActivationChallenge() {
      if (!this.isOnScreenActivation) {
         throw new FailureException("Letter required for activation");
      } else {
         return this.activationSession.get().getChallenge1().get();
      }
   }

   @Override
   public MapifiedValues mapify() {
      return MapifiedValuesBuilder.mapifiedValues()
         .put("onScreen", this.isOnScreenActivation)
         .putIfPresent("session", this.activationSession.map(CrontoActivationSessionMapificationUtils::mapifyActivationSession))
         .putIfPresent("challenge", this.activationChallenge.map(CrontoActivationChallenge::mapify))
         .build();
   }

   public static CrontoActivationStepSession demapify(MapifiedValues values) {
      return new CrontoActivationStepSession(
         values.<Boolean>get("onScreen"),
         values.demapifyOptional("session", CrontoActivationSessionMapificationUtils::demapifyActivationSession),
         values.demapifyOptional("challenge", CrontoActivationChallenge::demapify)
      );
   }

   @SuppressFBWarnings(justification = "generated code")
   public boolean isOnScreenActivation() {
      return this.isOnScreenActivation;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<CrontoActivationSession> getActivationSession() {
      return this.activationSession;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Optional<CrontoActivationChallenge> getActivationChallenge() {
      return this.activationChallenge;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setActivationSession(Optional<CrontoActivationSession> activationSession) {
      this.activationSession = activationSession;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setActivationChallenge(Optional<CrontoActivationChallenge> activationChallenge) {
      this.activationChallenge = activationChallenge;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "CrontoActivationStepSession(isOnScreenActivation="
         + this.isOnScreenActivation()
         + ", activationSession="
         + this.getActivationSession()
         + ", activationChallenge="
         + this.getActivationChallenge()
         + ")";
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   private CrontoActivationStepSession(
      boolean isOnScreenActivation, Optional<CrontoActivationSession> activationSession, Optional<CrontoActivationChallenge> activationChallenge
   ) {
      this.isOnScreenActivation = isOnScreenActivation;
      this.activationSession = activationSession;
      this.activationChallenge = activationChallenge;
   }
}
