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.user.UserIdentity;
import com.airlock.iam.common.domain.model.role.RolesUtil;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.flow.shared.domain.model.valueprovider.RoleProvider;
import com.airlock.iam.login.application.configuration.targetapp.ConditionBasedRoleProviderConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Set;

@LogicForConfig(ConditionBasedRoleProviderConfig.class)
public final class ConditionBasedRoleProvider implements RoleProvider {
   private final Provider<FlowCondition> condition;
   private final ConditionBasedRoleProviderConfig config;

   @Inject
   public ConditionBasedRoleProvider(Provider<FlowCondition> condition, ConditionBasedRoleProviderConfig config) {
      this.condition = condition;
      this.config = config;
   }

   @Override
   public Set<Role> provideRoles(UserIdentity userId) {
      return !((FlowCondition)this.condition.get()).isFulfilled() ? Set.of() : RolesUtil.rolesFrom(this.config.getRoles());
   }
}
