package com.airlock.iam.common.infrastructure.exception;

import com.airlock.iam.base.api.domain.model.validation.ValidatorError;
import com.airlock.iam.base.infrastructure.mapper.ValidationToErrorMapper;
import jakarta.annotation.Priority;
import jakarta.inject.Inject;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
import java.util.List;

@Priority(100)
@Provider
public final class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {
   public static final int CONSTRAINT_VIOLATION_MAPPER_PRIORITY = 100;
   private final ValidationToErrorMapper errorMapper;

   @Inject
   public ConstraintViolationExceptionMapper(ValidationToErrorMapper errorMapper) {
      this.errorMapper = errorMapper;
   }

   public Response toResponse(ConstraintViolationException exception) {
      List<ValidatorError> validationErrors = exception.getConstraintViolations()
         .stream()
         .map(violation -> ConstraintViolationMapper.mapConstraintViolationToError((ConstraintViolation<?>)violation, true))
         .toList();
      return this.errorMapper.mapToResponse(validationErrors);
   }
}
