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 on context data.")
public final class ContextDataAccessRule {
   @StringProperty(optional = false, description = "The name of a context data column for which to configure the access.")
   private String contextDataField;
   @StringProperty(
      optional = true,
      description = "Defines the set of required roles needed to access the resource. 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 getContextDataField() {
      return this.contextDataField;
   }

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

   public static String toAction(Actions action, String contextDataField) {
      return action.name() + "{" + contextDataField + "}";
   }

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

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

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

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

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

      @SuppressFBWarnings(justification = "generated code")
      public ContextDataAccessRule.ContextDataAccessRuleBuilder contextDataField(String contextDataField) {
         this.contextDataField = contextDataField;
         return this;
      }

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

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "ContextDataAccessRule.ContextDataAccessRuleBuilder(contextDataField=" + this.contextDataField + ", roles=" + this.roles + ")";
      }
   }
}
