/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.cosmodas.FacadeCosmos;

import com.cosmodas.EntCosmos.Consultores;
import com.cosmodas.EntCosmos.ProcesoPedidos;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * @author informatica
 */
@Stateless
public class ProcesoPedidosFacade extends AbstractFacade<ProcesoPedidos> implements ProcesoPedidosFacadeLocal {

    @PersistenceContext(unitName = "wcosmodasPersistent")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ProcesoPedidosFacade() {
        super(ProcesoPedidos.class);
    }

    @Override
    public List<ProcesoPedidos> pedidosCreditos() {
        List<ProcesoPedidos> rs = em.createNamedQuery("ProcesoPedidos.findByAprobadoCreDes").getResultList();
        if (rs.size() == 0) {
            return new ArrayList<>();
        } else {
            return rs;
        }

    }

    @Override
    public List<ProcesoPedidos> pedidoDespacho() {
        List<ProcesoPedidos> rs = em.createNamedQuery("ProcesoPedidos.findByAprobadoDesDes").getResultList();

        if (rs.size() == 0) {
            return new ArrayList<>();
        } else {
            return rs;
        }

    }

    @Override
    public List<ProcesoPedidos> pedidosCreditosRep(String territorio) {
        Query q = em.createNamedQuery("ProcesoPedidos.findByAprobadoCreRep");
        q.setParameter("territorio", territorio);
        List<ProcesoPedidos> rs = new ArrayList<>();
        if (!q.getResultList().isEmpty()) {
            rs = q.getResultList();
        }
        return rs;
    }

    @Override
    public List<ProcesoPedidos> pedidoDespachoRep(String territorio) {
        Query q = em.createNamedQuery("ProcesoPedidos.findByAprobadoDesRep");
        q.setParameter("territorio", territorio);
        List<ProcesoPedidos> rs = new ArrayList<>();
        if (!q.getResultList().isEmpty()) {
            rs = q.getResultList();
        }
        return rs;
    }

    @Override
    public void editaProceso(ProcesoPedidos pedido) {

        Query q = em.createNamedQuery("ProcesoPedidos.UpdateAprobacion");
        q.setParameter("aprobado", pedido.getAprobado());
        q.setParameter("tiempoAprobado", new Date());
        q.setParameter("numeracionDiaria", pedido.getNumeracionDiaria());
        q.setParameter("idpp", pedido.getIdpp());

        q.executeUpdate();
    }

    @Override
    public void editaProcesob(ProcesoPedidos ped) {
        Query q = em.createNamedQuery("ProcesoPedidos.UpdateDespacho");
        q.setParameter("despachadoB", true);
        q.setParameter("despachado", new Date());
        q.setParameter("idpp", ped.getIdpp());

        q.executeUpdate();

    }

    @Override
    public void editaImpresion(int ped) {
        Query q = em.createNamedQuery("ProcesoPedidos.UpdateDespachoImp");
        q.setParameter("inicioSacadoB", true);
        q.setParameter("inicioSacado", new Date());
        q.setParameter("idpp", ped);

        q.executeUpdate();
    }

    @Override
    public ProcesoPedidos busquedaFechaCodigo(Consultores cosultorCodigo, Date fecha) {

        Query q = em.createNamedQuery("ProcesoPedidos.codigoFechaDesc");
        q.setParameter("consultorCodigo", cosultorCodigo);
        q.setParameter("fechaPedido", fecha);

        try {
            return (ProcesoPedidos) q.getResultList().get(0);
        } catch (IndexOutOfBoundsException e) {
            return new ProcesoPedidos();
        }

    }

    @Override
    public ProcesoPedidos busquedaUltimoPedido() {
        Query q = em.createNamedQuery("ProcesoPedidos.findAll");
        try {
            return (ProcesoPedidos) q.getResultList().get(1);
        } catch (IndexOutOfBoundsException e) {
            return new ProcesoPedidos();
        }
    }

    //select dbcosmodas.correlativo_proceso_pedido(3);
    @Override
    public Integer obtenerCorrelativoDespacho(int tipoPedido) {
        StringBuilder sql = new StringBuilder("SELECT correlativo_proceso_pedido(?)");
        Query query = em.createNativeQuery(sql.toString());
        query.setParameter(1, tipoPedido);
        List<Integer> result = query.getResultList();
        return result.get(0);
    }

    @Override
    public List<ProcesoPedidos> reportePedidosDespacho() {
        Query q = em.createNamedQuery("ProcesoPedidos.findAllDesReport");

        try {
            return q.getResultList();
        } catch (IndexOutOfBoundsException e) {
            return new ArrayList<>();
        }
    }

    @Override
    public List<ProcesoPedidos> reportePedidosDespachoPrep() {
        Query q = em.createNamedQuery("ProcesoPedidos.findAllDesReportPrep");

        try {
            return q.getResultList();
        } catch (IndexOutOfBoundsException e) {
            return new ArrayList<>();
        }
    }

    @Override
    public List<ProcesoPedidos> reportePedidosDespachoFact() {
        Query q = em.createNamedQuery("ProcesoPedidos.findAllDesReportFact");

        try {
            return q.getResultList();
        } catch (IndexOutOfBoundsException e) {
            return new ArrayList<>();
        }
    }

    @Override
    public List<ProcesoPedidos> pedidosPorTerritorios(String territorio) {
        Query q = em.createNamedQuery("ProcesoPedidos.findAllRepReportSupall");
        q.setParameter("territorio", territorio);

        try {
            return q.getResultList();
        } catch (IndexOutOfBoundsException e) {
            return new ArrayList<>();
        }
    }

    @Override
    public List<ProcesoPedidos> pedidosPorTerritoriosPrep(String territorio) {
        Query q = em.createNamedQuery("ProcesoPedidos.findAllRepReportSupPrep");
        q.setParameter("territorio", territorio);

        try {
            return q.getResultList();
        } catch (IndexOutOfBoundsException e) {
            return new ArrayList<>();
        }
    }

    @Override
    public List<ProcesoPedidos> pedidosPorTerritoriosFact(String territorio) {

        try {
            Query q = em.createNamedQuery("ProcesoPedidos.findAllRepReportSupFact");
            q.setParameter("territorio", territorio);
            return q.getResultList();
        } catch (Exception e) {
            return new ArrayList<>();
        }
    }

}
