package com.airlock.iam.authentication.application.service.devicetoken;

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.flow.shared.domain.model.step.devicetoken.DeviceTokenRegistrationStep;
import jakarta.inject.Inject;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;

public final class AuthDeviceTokenRegistration {
   private final FlowProvider flowProvider;

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

   public FlowResult registerDeviceToken(Optional<String> serial, Optional<String> label, Map<String, String> publicKey) {
      return this.executeStepMethod(deviceTokenRegistrationStep -> deviceTokenRegistrationStep.registerDeviceToken(serial, label, publicKey));
   }

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