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

import com.airlock.iam.authentication.application.configuration.identification.UserByDataIdentifyingStepConfig;
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.google.common.base.Preconditions;
import jakarta.inject.Inject;
import java.util.Set;

@DefaultUiCreator(UserByDataIdentifyingStepUiSettingsCreator.UserByDataIdentifyingStepUiSettingsCreatorScreensConfigDefinition.class)
public final class UserByDataIdentifyingStepUiSettingsCreator implements StepUiSettingsCreator {
   private final UserDataStepUiSettingCreatorService service;

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

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

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