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

import com.airlock.iam.admin.domain.model.administrator.permissions.Actions;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;

@Plugin(description = "Defines fine-grained permissions for User Management Extensions.")
public final class UserManagementExtensionAccessRuleConfig {
   @StringProperty(optional = false, description = "The ID of a User Management Extension for which to configure the access.")
   private String id;
   @StringProperty(
      optional = true,
      description = "Defines the set of required roles needed to view the specified User Management Extension. Multiple roles are specified as a comma-separated list. Without a value, access is always denied. The special value 'NO RESTRICTION' allows access for any authenticated admin, without role restrictions.",
      suggestedValues = {
            "NO RESTRICTION",
            "useradmin",
            "tokenadmin",
            "helpdesk",
            "sysadmin",
            "superadmin",
            "useradmin,tokenadmin",
            "useradmin,helpdesk",
            "tokenadmin,helpdesk",
            "sysadmin,superadmin",
            "useradmin,tokenadmin,helpdesk,sysadmin,superadmin"
      }
   )
   private String roles;

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

   @Nullable
   public String getRoles() {
      return this.roles;
   }

   public static String toAction(String userManagementExtensionId) {
      return Actions.displayUserManagementExtensions.name() + "{" + userManagementExtensionId + "}";
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public UserManagementExtensionAccessRuleConfig(String id, String roles) {
      this.id = id;
      this.roles = roles;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class UserManagementExtensionAccessRuleConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String id;
      @SuppressFBWarnings(justification = "generated code")
      private String roles;

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

      @SuppressFBWarnings(justification = "generated code")
      public UserManagementExtensionAccessRuleConfig.UserManagementExtensionAccessRuleConfigBuilder id(String id) {
         this.id = id;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserManagementExtensionAccessRuleConfig.UserManagementExtensionAccessRuleConfigBuilder roles(String roles) {
         this.roles = roles;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public UserManagementExtensionAccessRuleConfig build() {
         return new UserManagementExtensionAccessRuleConfig(this.id, this.roles);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "UserManagementExtensionAccessRuleConfig.UserManagementExtensionAccessRuleConfigBuilder(id=" + this.id + ", roles=" + this.roles + ")";
      }
   }
}
