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

import java.util.Collections;
import java.util.List;

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

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

    private final String propertyName;
    private final Boolean checkForNull;

    public NullPropertySpecification(String propertyName, Boolean checkForNull, List<String> joins) {
        super(joins);
        this.propertyName = propertyName;
        this.checkForNull = checkForNull;
    }

    public NullPropertySpecification(String propertyName, Boolean checkForNull) {
        this(propertyName, checkForNull, Collections.emptyList());
    }

    @Override
    protected boolean canProducePredicate() {
        return checkForNull != null;
    }

    @Override
    protected Predicate doOperation(CriteriaBuilder cb, Path<T> path) {
        if (checkForNull) {
            return cb.isNull(path.get(propertyName));
        } else {
            return cb.isNotNull(path.get(propertyName));
        }
    }

}
