package com.airlock.iam.flow.shared.application.configuration.airlock2fa;

import com.airlock.iam.airlock2fa.api.application.configuration.Airlock2FADeviceIdsProviderConfig;
import com.airlock.iam.factor.application.configuration.airlock2fa.Airlock2FASettings;
import com.airlock.iam.flow.api.application.configuration.selection.FlowConditionConfig;
import com.airlock.iam.flow.api.application.configuration.step.AbstractFlowStepConfig;
import com.airlock.iam.flow.api.application.configuration.step.NonInteractiveStepConfig;
import com.airlock.iam.flow.api.application.configuration.step.StepIdConfig;
import com.airlock.iam.flow.api.application.configuration.tag.TagConfig;
import com.airlock.iam.flow.api.application.configuration.valueprovider.ValueMapProviderConfig;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForAuthenticationFlows;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForPublicSelfServiceFlows;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForSelfServiceFlows;
import com.airlock.iam.flow.types.api.application.configuration.step.StepConfigForTransactionApprovalFlows;
import com.airlock.iam.plugin.api.annotation.config.Groups;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.license.PluginLicenseRestriction;
import com.airlock.iam.plugin.api.annotation.property.GroupProperty;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import java.util.List;
import java.util.Map;

@Plugin(
   description = "Step to non-interactively delete Airlock 2FA devices of the current user.</br>The devices which will be deleted can be configured by the corresponding property.</br>In case the user does not have an Airlock 2FA Account, the step succeeds without deleting any devices.<p>Common use cases which can be achieved with this step are:<ul><li>Remove all Airlock 2FA devices.</li><li>Remove all Airlock 2FA devices except previously activated devices in this flow.</li><li>Remove all Airlock 2FA devices except the last registered device.</li><li>Remove the Airlock 2FA device which was used for login unless it is the last device.</li></ul>",
   displayName = "Airlock 2FA Delete Devices Step"
)
@Groups(openGroups = "Basic Settings", groupSequence = {"Basic Settings", "Tags/Guards", "Flow Control"})
@PluginLicenseRestriction(moduleAffiliation = "Airlock2FA")
public final class Airlock2FADeleteDevicesStepConfig
   extends AbstractFlowStepConfig
   implements NonInteractiveStepConfig,
   StepConfigForAuthenticationFlows,
   StepConfigForSelfServiceFlows,
   StepConfigForPublicSelfServiceFlows,
   StepConfigForTransactionApprovalFlows {
   @PluginProperty(
      displayName = "Airlock 2FA Settings",
      description = "Settings of Airlock 2FA.",
      optional = false,
      globalPluginReference = "globalAirlock2FASettings"
   )
   @GroupProperty(groupIdentifier = "Basic Settings")
   private Airlock2FASettings airlock2FASettings;
   @PluginProperty(
      description = "Devices which will be deleted.</br> In case no device ID is provided, the step succeeds without deleting any devices.",
      optional = false
   )
   @GroupProperty(groupIdentifier = "Basic Settings")
   private Airlock2FADeviceIdsProviderConfig devicesToDelete;

   public Airlock2FADeleteDevicesStepConfig(
      @Nullable FlowConditionConfig skipCondition,
      @Nullable FlowConditionConfig preCondition,
      boolean requiresActivation,
      List<TagConfig> tagsOnSuccess,
      @Nullable StepIdConfig stepId,
      Map<String, StepIdConfig> onFailureGotos,
      List<ValueMapProviderConfig> customResponseAttributes,
      List<ValueMapProviderConfig> customFailureResponseAttributes,
      Airlock2FASettings airlock2FASettings,
      Airlock2FADeviceIdsProviderConfig devicesToDelete
   ) {
      super(skipCondition, preCondition, requiresActivation, tagsOnSuccess, stepId, onFailureGotos, customResponseAttributes, customFailureResponseAttributes);
      this.airlock2FASettings = airlock2FASettings;
      this.devicesToDelete = devicesToDelete;
   }

   public Airlock2FASettings getAirlock2faSettings() {
      return this.airlock2FASettings;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder builder() {
      return new Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public Airlock2FADeleteDevicesStepConfig() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class Airlock2FADeleteDevicesStepConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private FlowConditionConfig skipCondition;
      @SuppressFBWarnings(justification = "generated code")
      private FlowConditionConfig preCondition;
      @SuppressFBWarnings(justification = "generated code")
      private boolean requiresActivation;
      @SuppressFBWarnings(justification = "generated code")
      private List<TagConfig> tagsOnSuccess;
      @SuppressFBWarnings(justification = "generated code")
      private StepIdConfig stepId;
      @SuppressFBWarnings(justification = "generated code")
      private Map<String, StepIdConfig> onFailureGotos;
      @SuppressFBWarnings(justification = "generated code")
      private List<ValueMapProviderConfig> customResponseAttributes;
      @SuppressFBWarnings(justification = "generated code")
      private List<ValueMapProviderConfig> customFailureResponseAttributes;
      @SuppressFBWarnings(justification = "generated code")
      private Airlock2FASettings airlock2FASettings;
      @SuppressFBWarnings(justification = "generated code")
      private Airlock2FADeviceIdsProviderConfig devicesToDelete;

      @SuppressFBWarnings(justification = "generated code")
      Airlock2FADeleteDevicesStepConfigBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder skipCondition(@Nullable FlowConditionConfig skipCondition) {
         this.skipCondition = skipCondition;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder preCondition(@Nullable FlowConditionConfig preCondition) {
         this.preCondition = preCondition;
         return this;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder tagsOnSuccess(List<TagConfig> tagsOnSuccess) {
         this.tagsOnSuccess = tagsOnSuccess;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder stepId(@Nullable StepIdConfig stepId) {
         this.stepId = stepId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder onFailureGotos(Map<String, StepIdConfig> onFailureGotos) {
         this.onFailureGotos = onFailureGotos;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder customResponseAttributes(
         List<ValueMapProviderConfig> customResponseAttributes
      ) {
         this.customResponseAttributes = customResponseAttributes;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder customFailureResponseAttributes(
         List<ValueMapProviderConfig> customFailureResponseAttributes
      ) {
         this.customFailureResponseAttributes = customFailureResponseAttributes;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder airlock2FASettings(Airlock2FASettings airlock2FASettings) {
         this.airlock2FASettings = airlock2FASettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder devicesToDelete(Airlock2FADeviceIdsProviderConfig devicesToDelete) {
         this.devicesToDelete = devicesToDelete;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FADeleteDevicesStepConfig build() {
         return new Airlock2FADeleteDevicesStepConfig(
            this.skipCondition,
            this.preCondition,
            this.requiresActivation,
            this.tagsOnSuccess,
            this.stepId,
            this.onFailureGotos,
            this.customResponseAttributes,
            this.customFailureResponseAttributes,
            this.airlock2FASettings,
            this.devicesToDelete
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "Airlock2FADeleteDevicesStepConfig.Airlock2FADeleteDevicesStepConfigBuilder(skipCondition="
            + this.skipCondition
            + ", preCondition="
            + this.preCondition
            + ", requiresActivation="
            + this.requiresActivation
            + ", tagsOnSuccess="
            + this.tagsOnSuccess
            + ", stepId="
            + this.stepId
            + ", onFailureGotos="
            + this.onFailureGotos
            + ", customResponseAttributes="
            + this.customResponseAttributes
            + ", customFailureResponseAttributes="
            + this.customFailureResponseAttributes
            + ", airlock2FASettings="
            + this.airlock2FASettings
            + ", devicesToDelete="
            + this.devicesToDelete
            + ")";
      }
   }
}
