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

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.flow.api.domain.model.step.StepAction;
import com.airlock.iam.flow.shared.application.configuration.airlock2fa.DefaultAirlock2FAApprovalStepActions;
import com.airlock.iam.flow.ui.api.domain.model.step.KnownStepUiPath;
import com.airlock.iam.flow.ui.infrastructure.service.ui.GlobalUiAttributes;
import com.airlock.iam.flow.ui.infrastructure.service.ui.StepUiService;
import com.airlock.iam.flow.ui.infrastructure.settings.SimpleDefaultUiSettings;
import com.airlock.iam.flow.ui.infrastructure.settings.StepUiSettings;
import com.airlock.iam.publicselfservice.application.configuration.ui.Airlock2FAPublicSelfServiceApprovalStepUiConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Map;
import java.util.Optional;

@LogicForConfig(Airlock2FAPublicSelfServiceApprovalStepUiConfig.class)
public final class Airlock2FAPublicSelfServiceApprovalStepUiService implements StepUiService {
   private static final String SHOW_APP_APPROVAL_LINK = "showAppApprovalLink";
   private static final Map<String, KnownStepUiPath> SUPPORTED_STEP_ACTIONS = Map.of(
      DefaultAirlock2FAApprovalStepActions.Actions.AIRLOCK_2FA_POLLING_REQUIRED.name(),
      KnownStepUiPath.APPROVAL_AIRLOCK_2FA_CHALLENGE_ONLY,
      DefaultAirlock2FAApprovalStepActions.Actions.AIRLOCK_2FA_POLLING_OR_OFFLINE_REQUIRED.name(),
      KnownStepUiPath.APPROVAL_AIRLOCK_2FA_CHALLENGE,
      DefaultAirlock2FAApprovalStepActions.Actions.AIRLOCK_2FA_DEVICE_CHOICE_REQUIRED.name(),
      KnownStepUiPath.APPROVAL_AIRLOCK_2FA_SELECTION,
      DefaultAirlock2FAApprovalStepActions.Actions.AIRLOCK_2FA_QR_CODE_OTP_REQUIRED.name(),
      KnownStepUiPath.APPROVAL_AIRLOCK_2FA_QRCODE,
      DefaultAirlock2FAApprovalStepActions.Actions.AIRLOCK_2FA_PASSCODE_REQUIRED.name(),
      KnownStepUiPath.AIRLOCK_2FA_PASSCODE
   );
   private final Airlock2FAPublicSelfServiceApprovalStepUiConfig config;
   private final Provider<GlobalUiAttributes> globalUiAttributes;

   @Inject
   Airlock2FAPublicSelfServiceApprovalStepUiService(Airlock2FAPublicSelfServiceApprovalStepUiConfig config, Provider<GlobalUiAttributes> globalUiAttributes) {
      this.config = config;
      this.globalUiAttributes = globalUiAttributes;
   }

   public StepUiSettings toSettings(StepAction currentStepAction) {
      SimpleDefaultUiSettings settings = SimpleDefaultUiSettings.builder()
         .pageId(pageId(currentStepAction))
         .stepId(this.config.getStepId())
         .uiTenantId(((GlobalUiAttributes)this.globalUiAttributes.get()).uiTenantId())
         .build();
      settings.getPageSettings().put("showAppApprovalLink", this.config.isShowAppApprovalLink());
      return settings;
   }

   private static String pageId(StepAction currentStepAction) {
      return Optional.ofNullable(SUPPORTED_STEP_ACTIONS.get(currentStepAction.name()))
         .<String>map(KnownStepUiPath::getPath)
         .orElseThrow(() -> new FailureException("Unsupported step action for Airlock 2FA approval step: " + currentStepAction.name()));
   }
}
