package com.airlock.iam.ssi.application.service;

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 com.airlock.iam.ssi.domain.model.step.SsiIssuanceStep;
import com.airlock.iam.ssi.domain.model.step.SsiStep;
import com.airlock.iam.ssi.domain.model.step.SsiVerificationStep;
import jakarta.inject.Inject;
import java.util.function.Function;

public final class Ssi {
   private final FlowProvider flowProvider;

   @Inject
   public Ssi(FlowProvider flowProvider) {
      this.flowProvider = flowProvider;
   }

   public FlowResult pollProofVerification(boolean queryOnly) {
      return this.executeStepMethod(step -> step.pollProofVerification(queryOnly), SsiVerificationStep.class);
   }

   public FlowResult pollOfferAcceptance(boolean queryOnly) {
      return this.executeStepMethod(step -> step.pollCredentialAcceptance(queryOnly), SsiIssuanceStep.class);
   }

   private <T extends SsiStep> FlowResult executeStepMethod(Function<T, StepResult> stepMethod, Class<T> stepType) {
      return this.flowProvider.getCurrentOrStartNew().execute(stepMethod, stepType);
   }
}
