package com.bytesw.bytebot.service;

import com.bytesw.xdf.dao.rsql.CustomRsqlVisitor;
import com.bytesw.xdf.sql.beans.Pagination;
import com.bytesw.xdf.sql.beans.SortField;
import cz.jirutka.rsql.parser.RSQLParser;
import cz.jirutka.rsql.parser.ast.Node;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;

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

/**
 * @author Sebastián Chicoma Sandmann
 * @version 9-sep-2020
 *
 * Copyright (c) 2020 Byte, S.A. Todos los derechos reservados.
 *
 * Este software constituye información confidencial y propietaria de Byte, S.A.
 * ("Información Confidencial"). Usted no debe develar dicha Información
 * Confidencial y debe usarla de acuerdo con los términos de aceptación de
 * licencia de uso que firmó con Byte.
 *
 */
public abstract class CustomPaginationService<T> {

    public Specification<T> createSpecification(final String filterExpression) {
        Node rootNode = new RSQLParser().parse(filterExpression);
        return rootNode.accept(new CustomRsqlVisitor<>());
    }

    public Sort createSort(Pagination pagination) {
        List<Sort.Order> orderList = new ArrayList<>();
        for (SortField sortField : pagination.getSortFields()) {
            if ("asc".equalsIgnoreCase(sortField.getDirection())) {
                orderList.add(Sort.Order.asc(sortField.getField()));
            } else {
                orderList.add(Sort.Order.desc(sortField.getField()));
            }
        }
        return Sort.by(orderList);
    }

}