package com.airlock.iam.publicselfservice.domain.model.step;

import com.airlock.iam.authentication.api.domain.model.step.IdentityProvidingFlowStep;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.flow.api.domain.model.session.FlowSession;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.shared.domain.model.continuation.FlowContinuationTokenHash;
import com.airlock.iam.flow.shared.domain.service.continuation.FlowContinuationTokenService;
import com.airlock.iam.publicselfservice.application.configuration.steps.FlowContinuationTokenConsumptionStepConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(FlowContinuationTokenConsumptionStepConfig.class)
public final class FlowContinuationTokenConsumptionStep implements IdentityProvidingFlowStep {
   private static final ELogger LOG = ELoggerFactory.getLogger(FlowContinuationTokenConsumptionStep.class);
   private final Provider<FlowContinuationTokenService> tokenService;
   private final Provider<FlowSession> flowSession;

   @Inject
   public FlowContinuationTokenConsumptionStep(Provider<FlowContinuationTokenService> tokenService, Provider<FlowSession> flowSession) {
      this.tokenService = tokenService;
      this.flowSession = flowSession;
   }

   @Override
   public StepResult initialize() {
      Optional<FlowContinuationTokenHash> flowContinuationTokenHash = ((FlowSession)this.flowSession.get())
         .flowAttributes()
         .tryGetAttribute(FlowContinuationTokenHash.class);
      if (flowContinuationTokenHash.isEmpty()) {
         return this.stepResultFactory().skip().build();
      }

      if (((FlowSession)this.flowSession.get()).getRedFlags().contains(FlowContinuationStep.FLOW_CONTINUATION_TOKEN_NOT_CONSUMED_RED_FLAG)) {
         ((FlowContinuationTokenService)this.tokenService.get()).deleteContinuationToken(flowContinuationTokenHash.get());
         ((FlowSession)this.flowSession.get()).flowAttributes().removeAttribute(FlowContinuationTokenHash.class);
         ((FlowSession)this.flowSession.get()).takeDownRedFlag(FlowContinuationStep.FLOW_CONTINUATION_TOKEN_NOT_CONSUMED_RED_FLAG);
         LOG.debug("Successfully consumed flow continuation token.");
      }

      return this.stepResultFactory().success().build();
   }

   @Override
   public String getDescription() {
      return "Flow Continuation Token Consumption Step";
   }
}
