package com.airlock.iam.authentication.infrastructure.service.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.step.CommonDataEditStepConfig;
import com.airlock.iam.flow.shared.application.configuration.step.UserDataEditStepConfig;
import com.airlock.iam.flow.shared.application.configuration.step.mtan.MtanTokenRegistrationStepConfig;
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.StepUiSettings;
import com.airlock.iam.flow.ui.infrastructure.settings.annotation.DefaultUiCreator;
import com.google.common.base.Preconditions;
import jakarta.inject.Inject;
import java.util.Set;

@DefaultUiCreator(UserDataAuthenticationStepUiSettingsCreator.UserDataEditStepUiSettingsCreatorScreenConfigsDefinition.class)
public class UserDataAuthenticationStepUiSettingsCreator implements StepUiSettingsCreator {
   private final UserDataStepUiSettingCreatorService service;

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

   public StepUiSettings createUiSettings(FlowStepConfig stepConfig, StepAction action) {
      Preconditions.checkArgument(stepConfig instanceof CommonDataEditStepConfig);
      return this.service.createUiSettings((CommonDataEditStepConfig)stepConfig);
   }

   public static class UserDataEditStepUiSettingsCreatorScreenConfigsDefinition implements CreatableScreenConfigsDefinition {
      public Set<ScreenConfig> creatableScreenConfigs() {
         return Set.of(ScreenConfig.screenConfigOf(UserDataEditStepConfig.class), ScreenConfig.screenConfigOf(MtanTokenRegistrationStepConfig.class));
      }
   }
}
