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

import com.airlock.iam.common.api.domain.model.role.Role;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Set;
import org.apache.commons.collections4.CollectionUtils;

@Plugin(
   description = "Strategy to select role specific configurations based on the admin's roles.<p>Selects a configuration if the admin has all of the roles required by the configuration. If a configuration requires no roles, it is always selected.</p>",
   displayName = "All Required Roles Match"
)
public class AllRequiredRolesMatcher implements RolebasedConfigSelectionStrategy {
   @Override
   public boolean isConfigApplicapleForAdminWithRoles(AdminRoleSpecificSetting config, Set<Role> adminRoles) {
      return !adminRoles.isEmpty() && CollectionUtils.isSubCollection(config.getRequiredAdminRoles(), adminRoles);
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class AllRequiredRolesMatcherBuilder {
      @SuppressFBWarnings(justification = "generated code")
      AllRequiredRolesMatcherBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public AllRequiredRolesMatcher build() {
         return new AllRequiredRolesMatcher();
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "AllRequiredRolesMatcher.AllRequiredRolesMatcherBuilder()";
      }
   }
}
