/*
 * 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.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
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 net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import org.primefaces.PrimeFaces;

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

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

    private String productoCodigo;
    private String productoNombre;
    private String productoCantidad;
    private String codigoBarra;
    private String dirReqRopa;
    private Productos producto;
    private List<cuerpoVineta> requisions;
    private cuerpoVineta 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 String getDirReqRopa() {
        return dirReqRopa;
    }

    public void setDirReqRopa(String dirReqRopa) {
        this.dirReqRopa = dirReqRopa;
    }

    public String getCodigoBarra() {
        return codigoBarra;
    }

    public void setCodigoBarra(String codigoBarra) {
        this.codigoBarra = codigoBarra;
    }

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

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

    public cuerpoVineta getRequision() {
        return requision;
    }

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


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

    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();
        this.codigoBarra = getProducto().getCodigoBarra();

    }


    public void nuevoProducto() {
        cuerpoVineta cue = new cuerpoVineta();
        cue.setProductoCodigo(productoCodigo);
        cue.setProductoNombre(productoNombre);
        cue.setCantidad(productoCantidad);
        cue.setCodigoBarra(codigoBarra);
        setRequision(cue);
    }


    public boolean validaExistenciaPedido() {

        boolean out = false;
        List<cuerpoVineta> q = new ArrayList<>();
        q = getRequisions();
        for (cuerpoVineta 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();
        this.codigoBarra = new String();
        requision = new cuerpoVineta();
    }


    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 fillReportRopa() throws JRException {

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(requisions);
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reportes/ropa.jasper");
        Map parametros = new HashMap();
        jasperPrint = JasperFillManager.fillReport(reportPath, parametros, beanCollectionDataSource);
    }


    public void ExcelCorreo(ActionEvent actionEvent) throws JRException, IOException {
        try {
            fillReportRopa();

            File xlsx = new File("/tmp/ropa.xlsx");
            JRXlsxExporter Xlsxexporter = new JRXlsxExporter();
            Xlsxexporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            Xlsxexporter.setParameter(JRExporterParameter.OUTPUT_FILE, xlsx);
            Xlsxexporter.exportReport();

            setDirReqRopa("/tmp/ropa.xlsx");

            Email mail = new Email();
            mail.imailRop("operez@marlenlamur-es.com", "ropa.xlsx", getDirReqRopa());
            mail.imailRop("programador@marlenlamur-es.com", "ropa.xlsx", getDirReqRopa());
            mail.imailRop("sistemas@marlenlamur-es.com", "ropa.xlsx", getDirReqRopa());
            mail.imailRop("jlogistica@marlenlamur-es.com", "ropa.xlsx", getDirReqRopa());
            mail.imailRop("auxbodega@marlenlamur-es.com", "ropa.xlsx", getDirReqRopa());
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Enviado", "Enviado Sastifactoriamente"));
        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "ERROR", "NO SE PUEDE enviar Correo");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }

    }


    @PostConstruct
    public void init() {
        requision = new cuerpoVineta();
        requisions = new ArrayList<cuerpoVineta>();

    }


    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 cuerpoVineta();
        }
    }

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

    public void LimpiarPantalla(ActionEvent actionEvent) {
        try {
            requisions = new ArrayList<>();
            requision = new cuerpoVineta();
            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 vineta() {
    }

}
