package com.airlock.iam.publicselfservice.infrastructure.mapper;

import com.airlock.iam.flow.api.domain.model.flow.FlowId;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.domain.model.session.InternalFlowSession;
import com.airlock.iam.flow.shared.domain.service.MetadataProvider;
import com.airlock.iam.flow.ui.infrastructure.settings.StepUiSettings;
import com.airlock.iam.flow.ui.infrastructure.settings.UiMetadata;
import com.airlock.iam.publicselfservice.infrastructure.service.ui.PublicSelfServiceUiService;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;

public final class PublicSelfServiceUiMetadataProvider implements MetadataProvider {
   private final Provider<Optional<PublicSelfServiceUiService>> uiService;
   private final Provider<InternalFlowSession> flowSession;

   @Inject
   public PublicSelfServiceUiMetadataProvider(Provider<Optional<PublicSelfServiceUiService>> uiService, Provider<InternalFlowSession> flowSession) {
      this.uiService = uiService;
      this.flowSession = flowSession;
   }

   @Override
   public Map<String, Object> metadata() {
      Optional<PublicSelfServiceUiService> service = (Optional<PublicSelfServiceUiService>)this.uiService.get();
      if (!service.isEmpty() && !((InternalFlowSession)this.flowSession.get()).lastResult().flatMap(StepResult::nextAction).isEmpty()) {
         StepUiSettings uiSettings = service.get().getCurrentStepUiSettings();
         FlowId flowId = service.get().getCurrentFlowId().orElseThrow();
         return UiMetadata.builder().stepUiSettings(uiSettings).flowId(flowId.getFlowId()).flowType("self-service").build().metadata();
      } else {
         return Collections.emptyMap();
      }
   }
}
