package io.delphiplatform.api.v3.validation;

import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl;

import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import io.delphiplatform.api.util.CollectionUtils;
import io.delphiplatform.api.v3.constant.ApplicationConstants;

public class ExactMatchesForStringCollectionValidator implements
    ConstraintValidator<ExactMatchesForStringCollection, Collection<String>> {

    private Set<String> anyOf;

    @Override
    public void initialize(ExactMatchesForStringCollection constraintAnnotation) {
        anyOf = Arrays.stream(constraintAnnotation.anyOf()).collect(Collectors.toSet());
    }

    @Override
    public boolean isValid(Collection<String> value, ConstraintValidatorContext context) {
        boolean isValid = CollectionUtils.isEmpty(value) || anyOf.containsAll(value);
        if (!isValid) {
            ((ConstraintValidatorContextImpl) context)
                .addMessageParameter(ApplicationConstants.ALLOWED_VALUES_PLACEHOLDER, anyOf);
        }
        return isValid;
    }
}
