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

import com.airlock.iam.base.infrastructure.error.ErrorResponse;
import com.airlock.iam.flow.api.domain.model.flow.FlowResult;
import com.airlock.iam.flow.api.domain.model.step.GenericStepError;
import com.airlock.iam.flow.api.domain.model.step.StepResultData;
import com.airlock.iam.flow.domain.model.result.NotAuthorizedData;
import com.airlock.iam.flow.infrastructure.transfer.response.FlowResponseTransformer;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response.Status;

public final class AuthenticationFlowResponseTransformer implements FlowResponseTransformer {
   @Override
   public void transformErrorResponse(FlowResult result, ErrorResponse.ErrorResponseBuilder builder) {
      result.nextStep().ifPresent(nextStep -> builder.meta("nextAuthStep", nextStep.name()));
      String wwwAuthenticate = result.<StepResultData>data()
         .filter(NotAuthorizedData.class::isInstance)
         .map(NotAuthorizedData.class::cast)
         .map(NotAuthorizedData::wwwAuthenticate)
         .orElse("None");
      result.error()
         .filter(e -> e.equals(GenericStepError.NOT_AUTHORIZED))
         .ifPresent(e -> builder.status(Status.UNAUTHORIZED).header("WWW-Authenticate", wwwAuthenticate));
   }
}
