package com.airlock.iam.login.rest.application.configuration;

import com.airlock.iam.core.application.configuration.contextdata.ContextDataItemNameConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.PluginListProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(
   displayName = "User Information Self-Service",
   description = "Configures the protected session-less REST endpoint <code>/&lt;loginapp-uri&gt;/rest/protected/my/self/</code>."
)
public final class UserSelfInformationConfig {
   @PluginListProperty(
      description = "List of names of context data fields to be returned for reading if no group settings are matching. This must be a subset of the context data fields configured in the user persister.<br> In any case, even if no list is configured, the two fields 'latestSuccessfulAuthentication' and 'secondLatestSuccessfulAuthentication' are returned in the attributes.<br> Additionally configured context data is returned in a separate map 'contextData' within the attributes.",
      optional = true
   )
   private List<ContextDataItemNameConfig> contextDataItemNames;
   public static final String CONTEXT_DATA_ITEM_NAMES_PROPERTY_NAME = "contextDataItemNames";
   @PluginListProperty(
      description = "<p>User data self information settings may be defined depending on a user's group membership.</p><p>This list defines group-specific settings:<ol> <li>If the group's condition is met by the user, the corresponding settings are used for this user.</li> <li>It is processed in order of definition, i.e. the first matched group condition determines the settings used.</li> <li>If no group condition is met, the configured group-independent context data names are used.</ol></p>",
      optional = true
   )
   private List<UserSelfInformationGroupConfig> groupSettings;
   public static final String GROUP_SETTINGS_CONFIG_NAME = "groupSettings";

   public List<ContextDataItemNameConfig> getContextDataItemNames() {
      return this.contextDataItemNames;
   }

   public List<UserSelfInformationGroupConfig> getGroupSettings() {
      return this.groupSettings;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public UserSelfInformationConfig(List<ContextDataItemNameConfig> contextDataItemNames, List<UserSelfInformationGroupConfig> groupSettings) {
      this.contextDataItemNames = contextDataItemNames;
      this.groupSettings = groupSettings;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class UserSelfInformationConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private List<ContextDataItemNameConfig> contextDataItemNames;
      @SuppressFBWarnings(justification = "generated code")
      private List<UserSelfInformationGroupConfig> groupSettings;

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

      @SuppressFBWarnings(justification = "generated code")
      public UserSelfInformationConfig.UserSelfInformationConfigBuilder contextDataItemNames(List<ContextDataItemNameConfig> contextDataItemNames) {
         this.contextDataItemNames = contextDataItemNames;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSelfInformationConfig.UserSelfInformationConfigBuilder groupSettings(List<UserSelfInformationGroupConfig> groupSettings) {
         this.groupSettings = groupSettings;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserSelfInformationConfig build() {
         return new UserSelfInformationConfig(this.contextDataItemNames, this.groupSettings);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "UserSelfInformationConfig.UserSelfInformationConfigBuilder(contextDataItemNames="
            + this.contextDataItemNames
            + ", groupSettings="
            + this.groupSettings
            + ")";
      }
   }
}
