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

import com.airlock.iam.airlock2fa.api.domain.model.Airlock2FADeviceId;
import com.airlock.iam.base.api.domain.model.mapification.Mapifiable;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.factor.domain.model.airlock2fa.Airlock2FADeviceDisplayName;
import com.airlock.iam.flow.api.domain.model.step.FlowStep;
import com.airlock.iam.flow.api.domain.model.step.StepAction;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.api.domain.model.step.StepResultDataWithId;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import lombok.NonNull;

public interface Airlock2FADeviceEditStep extends FlowStep {
   String DISPLAY_NAME_ATTRIBUTE = "displayName";

   StepResult retrieveCurrentDisplayName();

   StepResult registerDisplayNameChange(String var1);

   StepResult validateAndContinue();

   final class Airlock2FADeviceCurrentData implements StepResultDataWithId, Mapifiable {
      private static final String DEVICE_ID = "deviceId";
      private static final String DISPLAY_NAME = "displayName";
      @NonNull
      private final Airlock2FADeviceId deviceId;
      @NonNull
      private final Airlock2FADeviceDisplayName displayName;

      public static Airlock2FADeviceEditStep.Airlock2FADeviceCurrentData airlock2FADeviceData(
         Airlock2FADeviceId deviceId, Airlock2FADeviceDisplayName displayName
      ) {
         return new Airlock2FADeviceEditStep.Airlock2FADeviceCurrentData(deviceId, displayName);
      }

      @Override
      public String id() {
         return this.deviceId.getId();
      }

      @Override
      public MapifiedValues mapify() {
         return MapifiedValuesBuilder.mapifiedValues().put("deviceId", this.deviceId.id()).put("displayName", this.displayName.getValue()).build();
      }

      public static Airlock2FADeviceEditStep.Airlock2FADeviceCurrentData demapify(MapifiedValues values) {
         return new Airlock2FADeviceEditStep.Airlock2FADeviceCurrentData(
            Airlock2FADeviceId.airlock2FADeviceId(values.get("deviceId")), Airlock2FADeviceDisplayName.airlock2FADeviceDisplayName(values.get("displayName"))
         );
      }

      @NonNull
      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeviceId getDeviceId() {
         return this.deviceId;
      }

      @NonNull
      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeviceDisplayName getDisplayName() {
         return this.displayName;
      }

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

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "Airlock2FADeviceEditStep.Airlock2FADeviceCurrentData(deviceId=" + this.getDeviceId() + ", displayName=" + this.getDisplayName() + ")";
      }

      @SuppressFBWarnings(justification = "generated code")
      Airlock2FADeviceCurrentData(@NonNull Airlock2FADeviceId deviceId, @NonNull Airlock2FADeviceDisplayName displayName) {
         if (deviceId == null) {
            throw new NullPointerException("deviceId is marked non-null but is null");
         }

         if (displayName == null) {
            throw new NullPointerException("displayName is marked non-null but is null");
         }

         this.deviceId = deviceId;
         this.displayName = displayName;
      }
   }

   enum Airlock2FADeviceEditStepActions implements StepAction {
      AIRLOCK_2FA_DEVICE_EDIT_POSSIBLE;
   }
}
