package com.airlock.iam.admin.application.configuration.users;

import com.airlock.iam.admin.application.service.user.SessionLockBehavior;
import com.airlock.iam.common.application.configuration.templock.TemporaryLockingConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import com.airlock.iam.plugin.api.annotation.property.StringListProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import java.util.List;
import java.util.Optional;

@Plugin(
   description = "<p>This plugin defines the lock reasons admins can select when locking users, the behavior when users are locked\ntemporarily, and the handling of active user sessions at the time of locking.</p>\n<p>Users may be locked automatically (e.g. after a certain amount of failed logins) or manually by the administrator.</p>",
   displayName = "Locking Settings (Adminapp)"
)
public class LockingSettings {
   @StringListProperty(
      description = "<p>Identity strings that define the lock reasons administrators can select when manually locking a user.\nTypically, these strings are set to the locale identifiers used with translation.</p>\n<p>The following manual lock reasons are predefined:\n<table>\n<tr><td>LockReason.InitiatedByUser</td><td> = \"Requested by user\"</td></tr>\n<tr><td>LockReason.InitiatedByAdmin</td><td> = \"Locked by administrator\"</td></tr>\n</table></p>\n",
      exampleElements = {"LockReason.InitiatedByUser", "LockReason.InitiatedByAdmin"},
      defaultValue = {"LockReason.InitiatedByUser", "LockReason.InitiatedByAdmin"},
      optional = true
   )
   private List<String> lockReasons;
   @PluginProperty(
      displayName = "Temporary Locking",
      description = "Settings for displaying temporary locking information on the user detail page.\nThese should be the same settings as those used in the Loginapp to ensure consistent locking durations.",
      optional = true
   )
   @Nullable
   private TemporaryLockingConfig temporaryLockingConfig;
   @PluginProperty(
      description = "<p>Defines how to handle existing user sessions at the time of locking.</p>\n<p>Note: Only applicable if the Adminapp is deployed behind the same Airlock Gateway (WAF) as the Loginapp.</p>",
      optional = true
   )
   private SessionLockBehavior sessionLockBehavior;

   public Optional<TemporaryLockingConfig> getTemporaryLockingConfig() {
      return Optional.ofNullable(this.temporaryLockingConfig);
   }

   public Optional<SessionLockBehavior> getSessionLockBehavior() {
      return Optional.ofNullable(this.sessionLockBehavior);
   }

   public List<String> getLockReasons() {
      return this.lockReasons;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public LockingSettings(List<String> lockReasons, @Nullable TemporaryLockingConfig temporaryLockingConfig, SessionLockBehavior sessionLockBehavior) {
      this.lockReasons = lockReasons;
      this.temporaryLockingConfig = temporaryLockingConfig;
      this.sessionLockBehavior = sessionLockBehavior;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class LockingSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private List<String> lockReasons;
      @SuppressFBWarnings(justification = "generated code")
      private TemporaryLockingConfig temporaryLockingConfig;
      @SuppressFBWarnings(justification = "generated code")
      private SessionLockBehavior sessionLockBehavior;

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

      @SuppressFBWarnings(justification = "generated code")
      public LockingSettings.LockingSettingsBuilder lockReasons(List<String> lockReasons) {
         this.lockReasons = lockReasons;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LockingSettings.LockingSettingsBuilder temporaryLockingConfig(@Nullable TemporaryLockingConfig temporaryLockingConfig) {
         this.temporaryLockingConfig = temporaryLockingConfig;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LockingSettings.LockingSettingsBuilder sessionLockBehavior(SessionLockBehavior sessionLockBehavior) {
         this.sessionLockBehavior = sessionLockBehavior;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LockingSettings build() {
         return new LockingSettings(this.lockReasons, this.temporaryLockingConfig, this.sessionLockBehavior);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "LockingSettings.LockingSettingsBuilder(lockReasons="
            + this.lockReasons
            + ", temporaryLockingConfig="
            + this.temporaryLockingConfig
            + ", sessionLockBehavior="
            + this.sessionLockBehavior
            + ")";
      }
   }
}
