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

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import com.airlock.iam.base.api.domain.model.validation.ValidationResultType;
import com.airlock.iam.base.api.domain.model.validation.ValidatorError;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class ValidationException extends ViolationException {
   private final List<ValidatorError> errors;

   public ValidationException(List<ValidatorError> errors) {
      super(toMessage(Objects.requireNonNull(errors)));
      this.errors = ImmutableList.copyOf(errors);
   }

   public ValidationException(ValidatorError... errors) {
      this(Arrays.asList(errors));
   }

   public ValidationException(String field, ValidationResultType type) {
      this(ValidatorError.validatorError(field, type));
   }

   private static String toMessage(List<ValidatorError> errors) {
      return errors.stream().map(ValidatorError::toString).collect(Collectors.collectingAndThen(Collectors.toList(), list -> Joiner.on(", ").join(list)));
   }

   @SuppressFBWarnings(justification = "generated code")
   public List<ValidatorError> getErrors() {
      return this.errors;
   }
}
