package com.airlock.iam.common.domain.model.role;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
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.application.configuration.role.KeepRoleTransformationConfig;
import jakarta.inject.Inject;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

@LogicForConfig(KeepRoleTransformationConfig.class)
public final class KeepRoleTransformation implements RoleTransformation {
   private final List<Pattern> keepPatterns;

   @Inject
   public KeepRoleTransformation(List<Pattern> keepPatterns) {
      this.keepPatterns = keepPatterns;
   }

   @Override
   public Set<Role> apply(Set<Role> before) {
      return before.stream().filter(this::filterRole).collect(Collectors.toSet());
   }

   private boolean filterRole(Role role) {
      return this.keepPatterns.stream().anyMatch(pattern -> pattern.matcher(role.formatRole()).matches());
   }
}
