package com.airlock.iam.publicselfservice.application.configuration.ui;

import com.airlock.iam.flow.api.application.configuration.step.StepIdConfig;
import com.airlock.iam.flow.api.domain.model.step.StepId;
import com.airlock.iam.flow.ui.infrastructure.settings.annotation.UiForStep;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.BooleanProperty;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import com.airlock.iam.publicselfservice.application.configuration.steps.Airlock2FAPublicSelfServiceApprovalStepConfig;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(
   description = "User interface configuration for \"Airlock 2FA Public Self-Service Approval Step\".",
   displayName = "Airlock 2FA Approval UI (Public Self-service)"
)
@UiForStep(Airlock2FAPublicSelfServiceApprovalStepConfig.class)
public final class Airlock2FAPublicSelfServiceApprovalStepUiConfig implements PublicSelfServiceStepUiConfig {
   @PluginProperty(description = "The ID of the step to which this user interface is referring.", displayName = "Step ID", optional = false)
   private StepIdConfig stepId;
   @BooleanProperty(
      description = "If enabled, when approving an operation using the Online QR Code factor, an app device link is displayed below the\nQR code. This link can be clicked to approve the operation in a mobile app (e.g. the Airlock 2FA app) instead of\nscanning the QR code. This is useful when the self-service is used on a mobile device and the displayed QR code\ncannot be scanned.",
      optional = true,
      defaultValue = "true"
   )
   private boolean showAppApprovalLink;

   public StepId getStepId() {
      return this.stepId.getId();
   }

   public boolean isShowAppApprovalLink() {
      return this.showAppApprovalLink;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public Airlock2FAPublicSelfServiceApprovalStepUiConfig(StepIdConfig stepId, boolean showAppApprovalLink) {
      this.stepId = stepId;
      this.showAppApprovalLink = showAppApprovalLink;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class Airlock2FAPublicSelfServiceApprovalStepUiConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private StepIdConfig stepId;
      @SuppressFBWarnings(justification = "generated code")
      private boolean showAppApprovalLink;

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

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FAPublicSelfServiceApprovalStepUiConfig.Airlock2FAPublicSelfServiceApprovalStepUiConfigBuilder stepId(StepIdConfig stepId) {
         this.stepId = stepId;
         return this;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      public Airlock2FAPublicSelfServiceApprovalStepUiConfig build() {
         return new Airlock2FAPublicSelfServiceApprovalStepUiConfig(this.stepId, this.showAppApprovalLink);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "Airlock2FAPublicSelfServiceApprovalStepUiConfig.Airlock2FAPublicSelfServiceApprovalStepUiConfigBuilder(stepId="
            + this.stepId
            + ", showAppApprovalLink="
            + this.showAppApprovalLink
            + ")";
      }
   }
}
