package com.airlock.iam.oauth2.domain.model.scope;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.flow.api.domain.model.step.FlowCondition;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import com.airlock.iam.oauth2.api.domain.model.provider.scope.OAuth2ScopeCondition;
import com.airlock.iam.oauth2.application.configuration.scope.FlowConditionBasedOAuth2ScopeConditionConfig;
import jakarta.inject.Inject;
import java.util.regex.Pattern;

@LogicForConfig(FlowConditionBasedOAuth2ScopeConditionConfig.class)
public final class FlowConditionBasedOAuth2ScopeCondition implements OAuth2ScopeCondition {
   private final Pattern scopeMatcher;
   private final FlowCondition condition;

   @Inject
   public FlowConditionBasedOAuth2ScopeCondition(Pattern scopeMatcher, FlowCondition condition) {
      this.scopeMatcher = scopeMatcher;
      this.condition = condition;
   }

   @Override
   public boolean isAllowed(OAuth2Scope scope) {
      return this.matches(scope) && this.condition.isFulfilled();
   }

   private boolean matches(OAuth2Scope scope) {
      return this.scopeMatcher.matcher(scope.name()).matches();
   }
}
