/*
 * 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 com.cosmodas.EntCosmos.Sucursales;
import com.cosmodas.EntCosmos.WcUsuarios;

import java.awt.event.ActionEvent;
import java.io.File;
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.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
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 net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import org.primefaces.PrimeFaces;

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

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

    //----------------------VARIABLES-------------------------------
    private String encargado;
    private String correo;
    private String sala;
    private String productoCodigo;
    private String productoNombre;
    private String productoCantidad;
    private String fecha;
    private String dirReq;
    private String dirReqRopa;
    private Productos producto;
    private int cantidaInterge;
    private List<CuerpoRequisicion> requisions;
    private CuerpoRequisicion requision;
    private JasperPrint jasperPrint;
    private ExternalContext exc;
    @Inject
    private Sucursales sucursales;
    @Inject
    private WcUsuarios usuarios;

    //----------------------Gets & Sets-----------------------------
    public WcUsuarios getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(WcUsuarios usuarios) {
        this.usuarios = usuarios;
    }

    public Sucursales getSucursales() {
        return sucursales;
    }

    public void setSucursales(Sucursales sucursales) {
        this.sucursales = sucursales;
    }

    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) {
        try {

            if (productoNombre.isEmpty() || productoNombre == null) {
            } else {
                setProductoCodigo(porNombre(productoNombre));
            }
            this.productoNombre = productoNombre;
        } catch (Exception e) {
        }
    }

    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 int getCantidaInterge() {
        return cantidaInterge;
    }

    public void setCantidaInterge(int cantidaInterge) {
        this.cantidaInterge = cantidaInterge;
    }

    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 getEncargado() {
        return encargado;
    }

    public void setEncargado(String encargado) {
        this.encargado = encargado;
    }

    public String getCorreo() {
        return correo;
    }

    public void setCorreo(String correo) {
        this.correo = correo;
    }

    public String getSala() {
        return sala;
    }

    public void setSala(String sala) {
        this.sala = sala;
    }

    public String getFecha() {
        return fecha;
    }

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

    public String getDirReq() {
        return dirReq;
    }

    public void setDirReq(String dirReq) {
        this.dirReq = dirReq;
    }

    public String getDirReqRopa() {
        return dirReqRopa;
    }

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

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

    }

    public void traerProc(String productoCodigo) {
        setProducto(prodlocal.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;
        System.err.println(productoNombre);
        if (productoNombre.isEmpty()) {

        } else {
            Productos pr = prodlocal.busquedaPorNombre(productoNombre);
            prCod = pr.getProductoCodigo();
        }
        return prCod;
    }

    public void fillReport() throws JRException {
        try {
            JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(requisions);
            String reportPath = "/opt/reportesJasper/requisicionReport.jrxml";
            JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
            Map parametros = new HashMap();
            parametros.put("fecha", fecha);
            parametros.put("encargado", encargado);
            parametros.put("sala", sala);
            jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
        } catch (JRException e) {
            System.out.println("aqui" + e);

        }

    }

    public void EnviarCorreo(ActionEvent actionEvent) throws JRException, IOException {
        try {
            fillReport();
            System.out.println("aqui");
            JasperExportManager.exportReportToPdfFile(jasperPrint, "/tmp/requisicion-" + sala + ".pdf");
            //  JasperExportManager.exportReportToPdfFile(jasperPrint, "/home/pedidos/requisicion-" + sala + ".pdf");
            setDirReq("/tmp/requisicion-" + sala + ".pdf");

            Email mail = new Email();
            mail.imailReq("operez@marlenlamur-es.com", "requisicion-" + sala + ".pdf", sala, getDirReq(), correo);
            mail.imailReq("programador@marlenlamur-es.com", "requisicion-" + sala + ".pdf", sala, getDirReq(), correo);
            mail.imailReq("sistemas@marlenlamur-es.com", "requisicion-" + sala + ".pdf", sala, getDirReq(), correo);
            mail.imailReq("jlogistica@marlenlamur-es.com", "requisicion-" + sala + ".pdf", sala, getDirReq(), correo);
            mail.imailReq("alogistica@marlenlamur-es.com", "requisicion-" + sala + ".pdf", sala, getDirReq(), correo);
            mail.imailReq(correo, "requisicion-" + sala + ".pdf", sala, getDirReq(), correo);
            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);
        }

    }

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

            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.imailReq("operez@marlenlamur-es.com", "ropa.xlsx", sala, getDirReqRopa(), correo);
//            mail.imailReq("programador@marlenlamur-es.com", "requisicion-"+sala+".pdf", sala, getDirReq(), correo);
//            mail.imailReq("sistemas@marlenlamur-es.com", "requisicion-"+sala+".pdf", sala, getDirReq(), correo);
//            mail.imailReq("jlogistica@marlenlamur-es.com", "requisicion-"+sala+".pdf", sala, getDirReq(), correo);
//            mail.imailReq("auxbodega@marlenlamur-es.com", "requisicion-"+sala+".pdf", sala, getDirReq(), correo);
//            mail.imailReq(correo, "requisicion-"+sala+".pdf", sala, getDirReq(), correo);
            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() {
        this.exc = FacesContext.getCurrentInstance().getExternalContext();
        this.sucursales = (Sucursales) exc.getSessionMap().get("sucursal");
        this.usuarios = (WcUsuarios) exc.getSessionMap().get("usuario");

        requision = new CuerpoRequisicion();
        requisions = new ArrayList<>();
        this.encargado = usuarios.getNombreEmpleado();
        this.correo = usuarios.getCorreo();
        this.sala = usuarios.getGrupoUsuario().getNombreGruposUsuarios();
        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 Requisicion() {

    }

}
