/*******************************************************************************
 * Copyright (c) 2013 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *  dclarke - initial
 ******************************************************************************/
package eclipselink.example.jpa.employee.services;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import eclipselink.example.jpa.employee.model.Employee;
import eclipselink.example.jpa.employee.model.Employee_;
import eclipselink.example.jpa.employee.services.paging.EntityPaging;
import eclipselink.example.jpa.employee.services.paging.EntityPaging.Type;
import eclipselink.example.jpa.employee.services.paging.FirstMaxPaging;
import eclipselink.example.jpa.employee.services.paging.IdInPaging;

/**
 * Search criteria definition. View layer populates this criteria and passes it
 * to the services layer for execution.
 * 
 * @author dclarke
 * @since EclipseLInk 2.4.2
 */
public class EmployeeCriteria {

    private String firstName = "%";

    private String lastName = "%";

    private String pagingType = "NONE";

    private int pageSize = 10;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getPagingType() {
        return pagingType;
    }

    public void setPagingType(String pagingType) {
        this.pagingType = pagingType;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    @SuppressWarnings("unchecked")
    public CriteriaQuery<Employee> createQuery(EntityManagerFactory emf) {
        CriteriaBuilder cb = emf.getCriteriaBuilder();
        CriteriaQuery<Employee> query = cb.createQuery(Employee.class);
        Root<Employee> employee = query.from(Employee.class);
        return (CriteriaQuery<Employee>) addWhereOrder(cb, query, employee, true);
    }

    @SuppressWarnings("unchecked")
    public CriteriaQuery<Employee> createQuery(EntityManager em) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Employee> query = cb.createQuery(Employee.class);
        Root<Employee> employee = query.from(Employee.class);
        return (CriteriaQuery<Employee>) addWhereOrder(cb, query, employee, true);
    }

    @SuppressWarnings("unchecked")
    public CriteriaQuery<Number> createIdQuery(EntityManagerFactory emf) {
        CriteriaBuilder cb = emf.getCriteriaBuilder();
        CriteriaQuery<Number> query = cb.createQuery(Number.class);
        Root<Employee> employee = query.from(Employee.class);
        query.select(employee.get(Employee_.id));
        return (CriteriaQuery<Number>) addWhereOrder(cb, query, employee, true);
    }

    @SuppressWarnings("unchecked")
    public CriteriaQuery<Number> createCountQuery(EntityManagerFactory emf) {
        CriteriaBuilder cb = emf.getCriteriaBuilder();
        CriteriaQuery<Number> query = cb.createQuery(Number.class);
        Root<Employee> employee = query.from(Employee.class);
        query.select(cb.count(employee.get(Employee_.id)));
        return (CriteriaQuery<Number>) addWhereOrder(cb, query, employee, false);
    }

    private CriteriaQuery<?> addWhereOrder(CriteriaBuilder cb, CriteriaQuery<?> query, Root<Employee> employee, boolean order) {
        Predicate where = cb.conjunction();

        if (getFirstName() != null && !getFirstName().isEmpty()) {
            where = cb.and(where, cb.like(employee.get(Employee_.firstName), getFirstName()));
        }

        if (getLastName() != null && !getLastName().isEmpty()) {
            where = cb.and(where, cb.like(employee.get(Employee_.lastName), getLastName()));
        }

        query.where(where);

        if (order) {
            query.orderBy(cb.asc(employee.get(Employee_.id)));
        }

        return query;
    }

    protected EntityPaging<Employee> getPaging(EntityManagerFactory emf) {
        if (getPagingType() != null) {
            Type type = EntityPaging.Type.valueOf(getPagingType());

            switch (type) {
            case NONE:
                return null;
            case PAGE:
                return new FirstMaxPaging(emf, createQuery(emf), createCountQuery(emf), getPageSize());
            case PAGE_IN:
                return new IdInPaging(emf, createIdQuery(emf), getPageSize());
            }
        }
        return null;
    }

}
