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

import com.airlock.iam.common.application.service.session.AirlockControlCookieService;
import com.airlock.iam.flow.api.domain.model.flow.FlowResult;
import com.airlock.iam.flow.api.domain.model.step.StepAction;
import com.airlock.iam.flow.api.domain.model.step.StepError;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;
import java.util.List;
import java.util.regex.Pattern;

public final class OneShotResponseMapper {
   private final Pattern errorCodeMatcher;
   private final Pattern nextStepMatcher;
   private final int httpStatusCode;
   private final List<OneShotResponseHeader> headers;
   private final AirlockControlCookieService.OneShotWorkflowAction workflow;
   private final AirlockControlCookieService controlCookieService;

   public boolean matches(FlowResult flowResult) {
      String nextStep = flowResult.nextStep().map(StepAction::name).orElse("");
      String error = flowResult.error().map(StepError::name).orElse("");
      return this.errorCodeMatcher.matcher(error).matches() && this.nextStepMatcher.matcher(nextStep).matches();
   }

   public ResponseBuilder createResponse() {
      ResponseBuilder builder = Response.status(this.httpStatusCode);
      this.headers.forEach(header -> header.addHeader(builder));
      this.controlCookieService.addOneShotWorkflowAction(this.workflow);
      return builder;
   }

   @SuppressFBWarnings(justification = "generated code")
   public OneShotResponseMapper(
      Pattern errorCodeMatcher,
      Pattern nextStepMatcher,
      int httpStatusCode,
      List<OneShotResponseHeader> headers,
      AirlockControlCookieService.OneShotWorkflowAction workflow,
      AirlockControlCookieService controlCookieService
   ) {
      this.errorCodeMatcher = errorCodeMatcher;
      this.nextStepMatcher = nextStepMatcher;
      this.httpStatusCode = httpStatusCode;
      this.headers = headers;
      this.workflow = workflow;
      this.controlCookieService = controlCookieService;
   }

   @SuppressFBWarnings(justification = "generated code")
   public int getHttpStatusCode() {
      return this.httpStatusCode;
   }
}
