/*
 * 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.pedidos;

import com.cosmodas.FacadeCosmos.ProductosFacadeLocal;
import com.cosmodas.EntCosmos.Productos;

import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import com.cosmodas.requisiscion.CuerpoRequisicion;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.primefaces.PrimeFaces;

/**
 * @author obper
 */
@ManagedBean(name = "preCompras", eager = true)
@ViewScoped
public class preCompras implements Serializable {


    //----------------------------EJB------------------------------
    @EJB
    ProductosFacadeLocal productosFacadeLocal;
    @EJB
    ProductosFacadeLocal prodlocal;

    //----------------------VARIABLES-------------------------------
    private String productoCodigo;
    private String productoNombre;
    private String productoCantidad;
    private String fecha;
    private Productos producto;
    private List<CuerpoRequisicion> requisions;
    private CuerpoRequisicion requision;
    private JasperPrint jasperPrint;
//----------------------Gets & Sets----------------------------- 

    public String getProductoCodigo() {
        return productoCodigo;
    }

    public void setProductoCodigo(String productoCodigo) {
        seteaVariables(productoCodigo);
        this.productoCodigo = productoCodigo;
    }

    public String getProductoNombre() {
        return productoNombre;
    }

    public void setProductoNombre(String productoNombre) {
        if (productoNombre.isEmpty()) {
        } else {
            setProductoCodigo(porNombre(productoNombre));
        }
        this.productoNombre = productoNombre;
    }

    public String getProductoCantidad() {
        return productoCantidad;
    }

    public void setProductoCantidad(String productoCantidad) {
        this.productoCantidad = productoCantidad;
    }

    public Productos getProducto() {
        return producto;
    }

    public void setProducto(Productos producto) {
        this.producto = producto;
    }


    public List<CuerpoRequisicion> getRequisions() {
        return requisions;
    }

    public void setRequisions(List<CuerpoRequisicion> requisions) {
        this.requisions = requisions;
    }

    public CuerpoRequisicion getRequision() {
        return requision;
    }

    public void setRequision(CuerpoRequisicion requision) {
        this.requision = requision;
    }


    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }


//--------------------------------------------------------------   

    public void seteaVariables(String llave) {
        if (llave.isEmpty()) {
        } else {
            traerProc(llave);
        }

    }

    public void traerProc(String productoCodigo) {
        setProducto(productosFacadeLocal.find(productoCodigo));
        this.productoNombre = getProducto().getProductoNombre();
        this.productoCodigo = getProducto().getProductoCodigo();

    }


    public void nuevoProducto() {
        CuerpoRequisicion cue = new CuerpoRequisicion();
        cue.setProductoCodigo(productoCodigo);
        cue.setProductoNombre(productoNombre);
        cue.setCantidad(productoCantidad);

        setRequision(cue);
    }


    public boolean validaExistenciaPedido() {

        boolean out = false;
        List<CuerpoRequisicion> q = new ArrayList<>();
        q = getRequisions();
        for (CuerpoRequisicion i : q) {
            if (i.getProductoCodigo().equals(getProductoCodigo())) {
                out = true;
            } else {
                out = false;
            }
        }
        return out;
    }

    public void borrar() {
        this.productoCodigo = new String();
        this.productoNombre = new String();
        this.productoCantidad = new String();
        requision = new CuerpoRequisicion();
    }


    public List<String> complete(String query) {            // Assumed Datasource
        List<Productos> q = new ArrayList<>();
//        precioPrograma = precioprogramaFacadeLocal.;
        q = prodlocal.porNombre("%" + query + "%");
        //     setListaProductos(q);
        List ai = new ArrayList();
        for (Productos i : q) {
            if ("13".equals(i.getDiscontinuado())) {
            } else {
                ai.add(i.getProductoNombre());
            }
        }
        return ai;
    }

    public String porNombre(String productoNombre) {
        String prCod = null;
        if (productoNombre.isEmpty()) {
        } else {
            Productos pr = prodlocal.busquedaPorNombre(productoNombre);
            prCod = pr.getProductoCodigo();
        }
        return prCod;
    }


    public void fillReport() throws JRException {

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(requisions);
        String reportPath = "/opt/reportesJasper/requisicionReport.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
    }


    @PostConstruct
    public void init() {
        requision = new CuerpoRequisicion();
        requisions = new ArrayList<CuerpoRequisicion>();
//         this.encargado = log.getUsersAndPass().getNombreEmpleado();
//         this.correo = log.getUsersAndPass().getCorreo();
//         this.sala = log.getUsersAndPass().getDepartamento();
        SimpleDateFormat formateador = new SimpleDateFormat("dd 'de' MMMM 'de' yyyy", new Locale("es_ES"));
        Date date = new Date();
        String f = formateador.format(date);
        this.fecha = f;

    }

    public void PDF(ActionEvent actionEvent) throws JRException, IOException {
        fillReport();
        HttpServletResponse httpServletResponse =
                (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
    }

    public void createNew() {
        //nuevoProducto();
        if (requisions.isEmpty()) {
            requisions.add(requision);
        } else if (validaExistenciaPedido()) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DUPLICADO", "El producto Ya esta en la Factura");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        } else {
            requisions.add(requision);
            requision = new CuerpoRequisicion();
        }
    }

    public String reinit() {
        requision = new CuerpoRequisicion();
        return null;
    }

    public void LimpiarPantalla(ActionEvent actionEvent) {
        try {
            requisions = new ArrayList<>();
            requision = new CuerpoRequisicion();
            borrar();

            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "CORRECTO", "CORRECTO");
            PrimeFaces.current().dialog().showMessageDynamic(message);

        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "NO SE PUEDE LIMPIAR PANTALLA");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
    }


    public preCompras() {

    }

}


       
