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

import com.airlock.iam.flow.api.domain.model.flow.FlowResult;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.domain.model.flow.FlowProvider;
import jakarta.inject.Inject;
import java.util.Set;
import java.util.function.Function;

public class OAuth2Consent {
   private final FlowProvider flow;

   @Inject
   public OAuth2Consent(FlowProvider flow) {
      this.flow = flow;
   }

   public FlowResult retrieveLocalConsent() {
      return this.flow.getCurrentOrStartNew().execute(OAuth2ConsentStep::retrieveLocalConsent, OAuth2ConsentStep.class);
   }

   public FlowResult grantLocalConsent(Set<String> grantedScopes) {
      return this.executeStepMethod(step -> step.grantLocalConsent(grantedScopes));
   }

   public FlowResult denyLocalConsent() {
      return this.executeStepMethod(OAuth2ConsentStep::denyLocalConsent);
   }

   public FlowResult checkRemoteConsent(String consentToken) {
      return this.executeStepMethod(step -> step.checkRemoteConsent(consentToken));
   }

   private FlowResult executeStepMethod(Function<OAuth2ConsentStep, StepResult> stepMethod) {
      return this.flow.getCurrentOrStartNew().execute(stepMethod, OAuth2ConsentStep.class);
   }
}
