package com.airlock.iam.flow.shared.infrastructure.factory;

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.common.api.domain.model.authmethod.AuthenticationMethod;
import com.airlock.iam.core.domain.model.authentication.method.KnownAuthenticationMethods;
import com.airlock.iam.core.misc.impl.authen.SimpleAuthenticationMethod;
import com.airlock.iam.flow.api.domain.model.step.StepError;
import com.airlock.iam.flow.domain.model.step.DynamicStepError;
import com.airlock.iam.flow.shared.application.configuration.step.FailureStepConfig;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import jakarta.annotation.Nonnull;
import java.util.stream.Stream;

@ModuleForConfig(FailureStepConfig.class)
public final class FailureStepModule extends PrivateModule {
   @Provides
   @Exposed
   StepError provideStepError(FailureStepConfig config) {
      return DynamicStepError.dynamicStepError(config.getErrorCode());
   }

   @Provides
   @Exposed
   AuthenticationMethod provideAuthMethod(FailureStepConfig config) {
      return Stream.of(KnownAuthenticationMethods.values())
         .map(AuthenticationMethod.class::cast)
         .filter(knownAuthMethod -> knownAuthMethod.getId().equals(config.getAuthMethod()))
         .findFirst()
         .orElseGet(() -> customAuthenticationMethod(config.getAuthMethod()));
   }

   @Nonnull
   private static SimpleAuthenticationMethod customAuthenticationMethod(String authMethodId) {
      return new SimpleAuthenticationMethod(authMethodId, "auth method configured in failure step");
   }

   protected void configure() {
   }
}
