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

import com.airlock.iam.flow.api.application.configuration.step.FlowStepConfig;
import com.airlock.iam.flow.api.domain.model.step.StepAction;
import com.airlock.iam.flow.shared.application.configuration.userdata.CommonUserDataStepConfig;
import com.airlock.iam.flow.ui.infrastructure.service.UserDataItemDefinitionLoader;
import com.airlock.iam.flow.ui.infrastructure.service.ui.CreatableScreenConfigsDefinition;
import com.airlock.iam.flow.ui.infrastructure.service.ui.GlobalUiAttributes;
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.UserDataStepUiSettingCreatorService;
import com.airlock.iam.flow.ui.infrastructure.settings.annotation.DefaultUiCreator;
import com.airlock.iam.flow.ui.infrastructure.settings.configurable.ConfigurableStepUiSettings;
import com.airlock.iam.publicselfservice.application.configuration.steps.PublicSelfServiceUserByDataIdentifyingStepConfig;
import com.google.common.base.Preconditions;
import jakarta.inject.Inject;
import java.util.Set;

@DefaultUiCreator(
   PublicSelfServiceUserByDataIdentifyingStepUiSettingsCreator.PublicSelfServiceUserByDataIdentifyingStepUiSettingsCreatorScreensConfigDefinition.class
)
public final class PublicSelfServiceUserByDataIdentifyingStepUiSettingsCreator implements StepUiSettingsCreator {
   private final UserDataStepUiSettingCreatorService service;

   @Inject
   public PublicSelfServiceUserByDataIdentifyingStepUiSettingsCreator(UserDataItemDefinitionLoader itemDefinitionLoader, GlobalUiAttributes globalUiAttributes) {
      this.service = new UserDataStepUiSettingCreatorService(
         itemDefinitionLoader, "data.", "public-self-service.userdata.", "/public/self-service", globalUiAttributes
      );
   }

   public ConfigurableStepUiSettings createUiSettings(FlowStepConfig stepConfig, StepAction action) {
      Preconditions.checkArgument(stepConfig instanceof CommonUserDataStepConfig);
      return this.service.createUiSettingsForIdentificationByUserData((CommonUserDataStepConfig)stepConfig);
   }

   public static class PublicSelfServiceUserByDataIdentifyingStepUiSettingsCreatorScreensConfigDefinition implements CreatableScreenConfigsDefinition {
      public Set<ScreenConfig> creatableScreenConfigs() {
         return Set.of(ScreenConfig.screenConfigOf(PublicSelfServiceUserByDataIdentifyingStepConfig.class));
      }
   }
}
