package com.airlock.iam.flow.shared.domain.model.valueprovider;

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.user.UserIdentity;
import com.airlock.iam.common.api.domain.model.valueprovider.ValueProvider;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.StringBasedRoleProviderConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.Objects;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;

@LogicForConfig(StringBasedRoleProviderConfig.class)
public class StringBasedRoleProvider implements RoleProvider {
   private final Provider<ValueProvider<String>> valueProvider;
   private final Provider<String> separator;

   @Inject
   public StringBasedRoleProvider(Provider<ValueProvider<String>> valueProvider, Provider<String> separator) {
      this.valueProvider = valueProvider;
      this.separator = separator;
   }

   @Override
   public Set<Role> provideRoles(UserIdentity userId) {
      if (((ValueProvider)this.valueProvider.get()).getValue() == null) {
         return Collections.emptySet();
      }

      String simpleSeparator = Pattern.quote((String)this.separator.get());
      return Pattern.compile(simpleSeparator)
         .splitAsStream((CharSequence)((ValueProvider)this.valueProvider.get()).getValue())
         .<String>map(StringUtils::trimToNull)
         .filter(Objects::nonNull)
         .map(Role::parseRole)
         .collect(Collectors.toSet());
   }
}
