package io.delphiplatform.api.v3.rdb.service.specification;

import java.util.Collection;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;

import io.delphiplatform.api.util.CollectionUtils;
import io.delphiplatform.api.util.JpaUtils;

public class ExcludeMultiValuePropertySpecification<T> extends OperationOnPropertySpecification<T> {

    private final List<String> propertyPath;
    private final Collection<?> searchValue;

    public ExcludeMultiValuePropertySpecification(List<String> propertyPath, Collection<?> searchValue, List<String> joins,
        boolean doDistinct) {
        super(joins, doDistinct);
        this.propertyPath = propertyPath;
        this.searchValue = searchValue;
    }


    @Override
    protected boolean canProducePredicate() {
        return !CollectionUtils.isEmpty(searchValue);
    }

    @Override
    protected Predicate doOperation(CriteriaBuilder cb, Path<T> path) {
        return cb.not(JpaUtils.getPath(path, propertyPath).in(searchValue));
    }
}
