package com.airlock.iam.oauth2.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.flow.shared.api.domain.service.FlowAttributeService;
import com.airlock.iam.flow.shared.domain.model.valueprovider.RoleProvider;
import com.airlock.iam.oauth2.application.configuration.valueprovider.OAuth2CredentialRolesProviderConfig;
import com.airlock.iam.oauth2.domain.model.oauth2.session.OAuth2CredentialAuthenticationFlowSessionAttribute;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Set;
import java.util.stream.Collectors;

@LogicForConfig(OAuth2CredentialRolesProviderConfig.class)
public final class OAuth2CredentialRolesProvider implements RoleProvider {
   private final Provider<FlowAttributeService> flowAttributes;

   @Inject
   public OAuth2CredentialRolesProvider(Provider<FlowAttributeService> flowAttributes) {
      this.flowAttributes = flowAttributes;
   }

   @Override
   public Set<Role> provideRoles(UserIdentity userId) {
      return ((FlowAttributeService)this.flowAttributes.get())
         .findAttribute(OAuth2CredentialAuthenticationFlowSessionAttribute.class)
         .map(attribute -> attribute.getRoles().stream().collect(Collectors.toSet()))
         .orElse(Set.of());
   }
}
