package com.airlock.iam.common.application.configuration.role;

import com.airlock.iam.common.api.application.configuration.role.RoleTransformationConfig;
import com.airlock.iam.common.api.domain.model.role.Role;
import com.airlock.iam.common.api.domain.model.role.RoleTransformation;
import com.airlock.iam.common.domain.model.role.AddRoleTransformation;
import com.airlock.iam.common.domain.model.role.RolesUtil;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.StringListProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import java.util.Set;

@Plugin(displayName = "Add Roles", description = "Add static roles to the list of propagated roles.")
public final class AddRoleTransformationConfig implements RoleTransformationConfig {
   @StringListProperty(
      displayName = "Add static roles",
      description = "A list of static roles. If the list of propagated roles already contains the same role, the role won't be added again.",
      exampleElements = {"customer", "administrator"},
      optional = false
   )
   private List<String> staticRoles;

   @Override
   public RoleTransformation toRoleTransformation() {
      Set<Role> newRoles = RolesUtil.rolesFrom(this.staticRoles);
      return new AddRoleTransformation(newRoles);
   }

   public List<String> getStaticRoles() {
      return this.staticRoles;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public AddRoleTransformationConfig(List<String> staticRoles) {
      this.staticRoles = staticRoles;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class AddRoleTransformationConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private List<String> staticRoles;

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

      @SuppressFBWarnings(justification = "generated code")
      public AddRoleTransformationConfig.AddRoleTransformationConfigBuilder staticRoles(List<String> staticRoles) {
         this.staticRoles = staticRoles;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AddRoleTransformationConfig build() {
         return new AddRoleTransformationConfig(this.staticRoles);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "AddRoleTransformationConfig.AddRoleTransformationConfigBuilder(staticRoles=" + this.staticRoles + ")";
      }
   }
}
