package com.fira.one.universel.criteria;

import java.util.ArrayList;
import java.util.List;

import org.springframework.data.jpa.domain.Specification;

public class GenericSpecificationBuilder<T, U> {

    protected final List<SearchCriteria> params;

    private Specification<U> specification;

    public GenericSpecificationBuilder() {
        params = new ArrayList<>();
        specification = Specification.where(null);
    }

    public GenericSpecificationBuilder<T, U> with(String key, String operation, Object value) {
        return with(key, operation, value, false);
    }

    public GenericSpecificationBuilder<T, U> with(String key, String operation, Object value, boolean orPredicate) {
        if (value != null) {
            var searchCriteria = new SearchCriteria(key, operation, value, orPredicate);
            add(new GenericSpecification<>(searchCriteria), orPredicate);
        }
        return this;
    }

    public Specification<U> add(Specification<U> spec) {
        return add(spec, false);
    }

    public Specification<U> add(Specification<U> spec, boolean isOrPredicate) {
        if (isOrPredicate) {
            specification = Specification.where(specification).or(spec);
        } else {
            specification = Specification.where(specification).and(spec);
        }

        return specification;
    }

    public List<SearchCriteria> getParams() {
        return this.params;
    }

    public Specification<U> getSpecification() {
        return this.specification;
    }

    public void setSpecification(Specification<U> specification) {
        this.specification = specification;
    }

}
