package com.airlock.iam.authentication.infrastructure.service.ui;

import com.airlock.iam.authentication.api.infrastructure.AuthenticationExtension;
import com.airlock.iam.flow.api.application.configuration.step.FlowStepConfig;
import com.airlock.iam.flow.ui.api.domain.service.CustomStepUiCreator;
import com.airlock.iam.flow.ui.infrastructure.service.ui.CustomStepUiCreatorFactory;
import com.airlock.iam.flow.ui.infrastructure.service.ui.DefaultStepUiConfigRepository;
import com.airlock.iam.flow.ui.infrastructure.service.ui.ScreenConfig;
import com.airlock.iam.flow.ui.infrastructure.service.ui.StepUiSettingsCreator;
import com.airlock.iam.flow.ui.infrastructure.service.ui.StepUiSettingsCreatorFactory;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Map;
import java.util.Set;

public class AuthenticationUiRepository extends DefaultStepUiConfigRepository {
   private static final Map<ScreenConfig, Class<? extends StepUiSettingsCreator>> DEFAULT_STEP_UI_CREATORS = scanDefaultUiCreatorClasses(
      "com.airlock.iam.authentication.infrastructure.service.ui"
   );
   private static final Map<ScreenConfig, Class<? extends CustomStepUiCreator>> CUSTOM_STEP_UI_CREATORS = loadCustomUiCreatorClasses(
      AuthenticationExtension.class
   );
   public static final Set<Class<? extends FlowStepConfig>> DEFAULT_UI_CAPABLE_AUTH_STEP_CONFIG_CLASSES = extractStepConfigClasses(
      new Map[]{DEFAULT_STEP_UI_CREATORS, CUSTOM_STEP_UI_CREATORS}
   );

   @Inject
   public AuthenticationUiRepository(Provider<StepUiSettingsCreatorFactory> creatorFactory, Provider<CustomStepUiCreatorFactory> customCreatorFactory) {
      super(creatorFactory, customCreatorFactory);
   }

   protected Map<ScreenConfig, Class<? extends StepUiSettingsCreator>> defaultStepUiCreators() {
      return DEFAULT_STEP_UI_CREATORS;
   }

   protected Map<ScreenConfig, Class<? extends CustomStepUiCreator>> customStepUiCreators() {
      return CUSTOM_STEP_UI_CREATORS;
   }
}
