package com.airlock.iam.login.domain.model.idpropagation;

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.api.domain.model.user.UserIdentity;
import com.airlock.iam.flow.shared.domain.model.valueprovider.RoleProvider;
import com.airlock.iam.login.application.configuration.targetapp.TransformingRoleProviderConfig;
import jakarta.inject.Inject;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@LogicForConfig(TransformingRoleProviderConfig.class)
public class TransformingRoleProvider implements RoleProvider {
   private final List<RoleProvider> roleProviders;
   private final List<RoleTransformation> roleTransformations;

   @Inject
   public TransformingRoleProvider(List<RoleProvider> roleProviders, List<RoleTransformation> roleTransformations) {
      this.roleProviders = roleProviders;
      this.roleTransformations = roleTransformations;
   }

   @Override
   public Set<Role> provideRoles(UserIdentity userId) {
      Set<Role> roles = this.roleProviders.stream().flatMap(provider -> provider.provideRoles(userId).stream()).collect(Collectors.toSet());

      for (RoleTransformation transformation : this.roleTransformations) {
         roles = transformation.apply(roles);
      }

      return roles;
   }
}
