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

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 com.airlock.iam.publicselfservice.api.infrastructure.PublicSelfServiceExtension;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Map;
import java.util.Set;

public class PublicSelfServiceUiRepository extends DefaultStepUiConfigRepository {
   private static final Map<ScreenConfig, Class<? extends StepUiSettingsCreator>> DEFAULT_STEP_UI_CREATORS = scanDefaultUiCreatorClasses(
      "com.airlock.iam.publicselfservice.infrastructure.settings.ui"
   );
   private static final Map<ScreenConfig, Class<? extends CustomStepUiCreator>> CUSTOM_STEP_UI_CREATORS = loadCustomUiCreatorClasses(
      PublicSelfServiceExtension.class
   );
   public static final Set<Class<? extends FlowStepConfig>> DEFAULT_UI_CAPABLE_PUBLIC_SELF_SERVICE_STEP_CONFIG_CLASSES = extractStepConfigClasses(
      new Map[]{DEFAULT_STEP_UI_CREATORS, CUSTOM_STEP_UI_CREATORS}
   );

   @Inject
   public PublicSelfServiceUiRepository(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;
   }
}
