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

import com.cosmodas.EntCosmos.*;
import com.cosmodas.FacadeCosmos.*;

import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.Serializable;
import java.util.*;
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.faces.model.SelectItem;
import javax.inject.Inject;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.primefaces.PrimeFaces;
import org.primefaces.event.RowEditEvent;
import org.primefaces.model.chart.PieChartModel;

/**
 *
 * @author obper
 */
@ManagedBean
@ViewScoped
public class bresultados implements Serializable {

    @EJB
    daoAjustesLocal daoA;
    @EJB
    ProductosZonasTotalFacadeLocal productosZonasTotalFacadeLocal;
    @EJB
    daoResutadosLocal daoR;
    @EJB
    ProductosZonasTotalFacadeLocal dao;
    @EJB
    ProductosFacadeLocal productosFacadeLocal;
    @EJB
    SucursalesFacadeLocal sfl;
    @Inject
    private WcUsuarios usuario;

    @EJB
    ProductosFacadeLocal daoPro;
    @EJB
    VZonasFacadeLocal vzfl;

    private List<Productos> productos;
    private ProductosZonasTotal proZon;
    private ProductosZonasTotal selecZona;
    private ProductosZonasTotal Zonases;
    private String productoNombre;
    private String productoCodigo;
    private String cajas;
    private String unidades;
    private Date fechaIngreso;
    private String vencimiento;
    private String zona;
    private String ususarioCodigo;
    private String sucursalCodigo;
    private String codigoBarra;
    private String productoSelect;
    private List<String> produc;
    private List<Productos> product;
    private String observaciones;
    private ProductosZonasTotal proEdit;
    private List<VZonas> listaZonasSalas;

    private ZonasVsActual presult;
    private ZonasVsActual presultselect;
    private ProductosZonasTotal pzonas;
    private String prodCod;
    private ZonasVsActual zonavsSelect;
    private PieChartModel status;
    private int exisActual;
    private int tomado;
    private List<ZonasVsActual> ropaInterior;
    private JasperPrint jasperprint;
    private List<ProductosZonasTotal> listaZonas;
    private List<ZonasVsActual> listaResultadoZonas;
    private ExternalContext exc;
    private List<ZonasVsActual> filtroCompleto;
    private List<Sucursales> sucursales;
    private Productos proSel;
   
    @Inject
    private Sucursales sucursal;


    public List<ZonasVsActual> getFiltroCompleto() {
        return filtroCompleto;
    }



    public boolean globalFilterFunction(Object value, Object filter, Locale locale) {
        String filterText = (filter == null) ? null : filter.toString().trim().toLowerCase();
        if (filterText == null || filterText.equals("")) {
            return true;
        }
     //   int filterInt = getInteger(filterText);

        ZonasVsActual pro = (ZonasVsActual) value;
        return pro.getProductoCodigo().toLowerCase().contains(filterText)
                || pro.getProductoCodigo().toLowerCase().contains(filterText);
    }

    public Productos getProSel() {
        return proSel;
    }

    public void setProSel(Productos proSel) {
        this.proSel = proSel;
    }

    public List<Productos> getProductos() {
        return productos;
    }

    public void setProductos(List<Productos> productos) {
        this.productos = productos;
    }

    public void setFiltroCompleto(List<ZonasVsActual> filtroCompleto) {
        this.filtroCompleto = filtroCompleto;
    }

    public List<ZonasVsActual> getListaResultadoZonas() {

        return listaResultadoZonas;
    }

    public List<Sucursales> getSucursales() {
        return sucursales;
    }

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

    public Sucursales getSucursal() {
        return sucursal;
    }

    public void setSucursal(Sucursales sucursal) {
        this.sucursal = sucursal;
    }

    public WcUsuarios getUsuario() {
        return usuario;
    }

    public void setUsuario(WcUsuarios usuario) {
        this.usuario = usuario;
    }

    public void setListaResultadoZonas(List<ZonasVsActual> listaResultadoZonas) {
        this.listaResultadoZonas = listaResultadoZonas;
    }

    public List<ProductosZonasTotal> getListaZonas() {
        return listaZonas;
    }

    public void setListaZonas(List<ProductosZonasTotal> listaZonas) {
        this.listaZonas = listaZonas;
    }

    @PostConstruct
    public void init() {
        proZon = new ProductosZonasTotal();
        presult = new ZonasVsActual();
        pzonas = new ProductosZonasTotal();
        observaciones = "Ninguna";
        vencimiento = "-";
        this.exc = FacesContext.getCurrentInstance().getExternalContext();
        this.sucursal =(Sucursales) exc.getSessionMap().get("sucursal");
        usuario = (WcUsuarios) exc.getSessionMap().get("usuario");
        listaZonas = new ArrayList<ProductosZonasTotal>();
        listaResultadoZonas = new ArrayList();
        this.listaResultadoZonas = daoR.productosPorSucursal(sucursal.getSucursalCodigo());
        sucursales = sfl.findAll();
        produc = new ArrayList<>();
        productos = new ArrayList();
        obtenerDatosZonas();

    }



    public JasperPrint getJasperprint() {
        return jasperprint;
    }

    public void setJasperprint(JasperPrint jasperprint) {
        this.jasperprint = jasperprint;
    }

    public int getExisActual() {
        return exisActual;
    }

    public void setExisActual(int exisActual) {
        this.exisActual = exisActual;
    }

    public int getTomado() {
        return tomado;
    }

    public void setTomado(int tomado) {
        this.tomado = tomado;
    }

    public String getProdCod() {
        return prodCod;
    }

    public void setProdCod(String prodCod) {
        this.prodCod = prodCod;
    }

    public ZonasVsActual getZonavsSelect() {
        return zonavsSelect;
    }

    public void setZonavsSelect(ZonasVsActual zonavsSelect) {
        this.zonavsSelect = zonavsSelect;
        setProdCod(zonavsSelect.getProductoCodigo());
    }

    public ZonasVsActual getPresultselect() {
        return presultselect;
    }

    public void setPresultselect(ZonasVsActual presultselect) {
        this.presultselect = presultselect;
        try {
            setProdCod(presultselect.getProductoCodigo());
        } catch (Exception e) {
        }

        // this.exisActual = presultselect.getExistenciaActual();     
    }

    public List<ZonasVsActual> getRopaInterior() {
        return ropaInterior;
    }

    public void setRopaInterior(List<ZonasVsActual> ropaInterior) {
        this.ropaInterior = ropaInterior;
    }

    public ProductosZonasTotal getPzonas() {
        return pzonas;
    }

    public void setPzonas(ProductosZonasTotal pzonas) {
        this.pzonas = pzonas;
    }

    public PieChartModel getStatus() {
        return status;
    }

    public void createStatus() {

        status = new PieChartModel();
        System.out.println("existencia" + exisActual);
        System.out.println("tomado" + tomado);
        status.set("Existencia Actual", 44);
        status.set("Total", tomado);
    }

    private void obtenerDatosZonas(){

       listaZonasSalas = vzfl.busquedaSucursal(sucursal.getSucursalCodigo());

    }

    //----------result
    public ZonasVsActual getPresult() {
        return presult;
    }

    public void setPresult(ZonasVsActual presult) {
        this.presult = presult;
    }

    public void llenarTabla() {
        try {
            setListaZonas(daoR.productosTotalCodigo(sucursal.getSucursalCodigo(), productosFacadeLocal.porCodigo(presultselect.getProductoCodigo())));
            resetVariables();
            obtenerDatosZonas();

        } catch (Exception e) {
        }

    }

    public void llenarTabla(ZonasVsActual in) {
        try {
            setListaZonas(daoR.productosTotalCodigo(in.getSucursalCodigo(), productosFacadeLocal.porCodigo(in.getProductoCodigo())));
        } catch (Exception e) {
        }

    }

    public void busquedaSucursal() {

        listaResultadoZonas = daoR.productosPorSucursal(sucursal.getSucursalCodigo());

        String summary = "Inventario de Sucursal " + sucursal.getSalaNombre();

        obtenerDatosZonas();

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(summary));
    }


    public boolean validaUSuario(){

        boolean rs = false;

        switch (usuario.getGrupoUsuario().getIdGruposUsuarios()){
            case 1:
                rs= true;
                break;
            case 4:
                rs= true;
                break;
            default:
                rs= false;
                break;
        }


        return rs;
    }


    public void actualizaDetalleProducto() {
        try {
            setListaZonas(daoR.productosTotalCodigo(sucursal.getSucursalCodigo(), productosFacadeLocal.porCodigo(presultselect.getProductoCodigo())));
        } catch (Exception e) {
        }

    }

    public void actualizaTablaPrincipal() {
        this.listaResultadoZonas = daoR.productosPorSucursal(sucursal.getSucursalCodigo());
    }

    public List<Presult> getPresults() {
        List total = daoR.allData();
        return total;
    }

    public void tablaDeEdicion() {
        
                Map<String, Object> options = new HashMap<String, Object>();
        options.put("resizable", false);
        PrimeFaces.current().dialog().openDynamic("detalleInventarioZonas", options, null);
    }


    public void fillReport() throws JRException {

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(daoR.RopaInterior(sucursal.getSucursalCodigo()));
        String reportPath = "/opt/reportesJasper/RopaInterior.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("sucursal",sucursal.getSalaNombreCorto());
        jasperprint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
    }

    public void fillReportDifencias() throws JRException {

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(daoR.diferiencias(sucursal.getSucursalCodigo()));
        String reportPath = "/opt/reportesJasper/diferencias.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("sucursal",sucursal.getSalaNombreCorto());
        jasperprint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
    }

    public void fillReportDifenciasPremios() throws JRException {

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(daoR.diferienciasProm(sucursal.getSucursalCodigo()));
        String reportPath = "/opt/reportesJasper/diferencias.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("sucursal",sucursal.getSalaNombreCorto());
        jasperprint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
    }
    public void ropa(ActionEvent actionEvent) throws JRException, IOException {
        fillReport();
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperprint, servletOutputStream);

    }

    public void diferenciasPremios(ActionEvent actionEvent) throws JRException, IOException {
        fillReportDifenciasPremios();
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperprint, servletOutputStream);

    }

    public void diferencias(ActionEvent actionEvent) throws JRException, IOException {
        fillReportDifencias();
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperprint, servletOutputStream);

    }

    public bresultados() {
    }

    public List<ZonasVsActual> getZonavsactual() {
        return daoR.productosPorSucursal(sucursal.getSucursalCodigo());
    }

    public List<VZonas> getListaZonasSalas() {
        return listaZonasSalas;
    }

    public void setListaZonasSalas(List<VZonas> listaZonasSalas) {
        this.listaZonasSalas = listaZonasSalas;
    }

    //----------------------
    public String getProductoSelect() {
        System.out.println(productoSelect);
        return productoSelect;
    }

    public ProductosZonasTotal getProEdit() {
        return proEdit;
    }

    public void setProEdit(ProductosZonasTotal proEdit) {
        this.proEdit = proEdit;
    }

    public void setProductoSelect(String productoSelect) {

        this.productoSelect = productoSelect;
    }

    public ProductosZonasTotal getProZon() {
        return proZon;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public void setProZon(ProductosZonasTotal proZon) {
        this.proZon = proZon;
    }

    public List<Productos> getProduct() {
        return product;
    }

    public void setProduct(List<Productos> product) {
        this.product = product;
    }

    public List<ProductosZonasTotal> getZonases() {
        return productosZonasTotalFacadeLocal.productosPorSucursal(sucursal.getSucursalCodigo());
    }

    public void setZonases(ProductosZonasTotal obj) {
        this.Zonases = obj;
    }

    public ProductosZonasTotal getSelecZona() {
        return selecZona;
    }

    public void setSelecZona(ProductosZonasTotal selecZona) {
        this.selecZona = selecZona;
    }

    public String getProductoNombre() {
        return productoNombre;
    }

    public void setProductoNombre(String productoNombre) {
        try {
            porNombre(productoNombre);
        } catch (Exception e) {
        }

        this.productoNombre = productoNombre;
    }

    public String getProductoCodigo() {
        return productoCodigo;
    }

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

    public String getCajas() {
        return cajas;
    }

    public void setCajas(String cajas) {
        this.cajas = cajas;
    }

    public String getUnidades() {
        return unidades;
    }

    public void setUnidades(String unidades) {
        this.unidades = unidades;
    }

    public Date getFechaIngreso() {
        return fechaIngreso;
    }

    public void setFechaIngreso(Date fechaIngreso) {
        this.fechaIngreso = fechaIngreso;
    }

    public String getVencimiento() {
        return vencimiento;
    }

    public void setVencimiento(String vencimiento) {
        this.vencimiento = vencimiento;
    }

    public String getZona() {
        return zona;
    }

    public void setZona(String zona) {
        this.zona = zona;
    }

    public String getUsusarioCodigo() {
        return ususarioCodigo;
    }

    public void setUsusarioCodigo(String ususarioCodigo) {
        this.ususarioCodigo = ususarioCodigo;
    }

    public String getSucursalCodigo() {
        return sucursalCodigo;
    }

    public void setSucursalCodigo(String sucursalCodigo) {
        this.sucursalCodigo = sucursalCodigo;
    }

    public String getCodigoBarra() {
        return codigoBarra;
    }

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

    public List<String> getProduc() {
        return produc;
    }

    public void setProduc(List<String> produc) {
        this.produc = produc;
    }


    public void onEdit(RowEditEvent event) {
        try {
            FacesMessage msg = new FacesMessage("Producto Guardado", ((ProductosZonasTotal) event.getObject()).getProductoCodigo().getProductoNombre());
            ProductosZonasTotal oj = (ProductosZonasTotal) event.getObject();
            productosZonasTotalFacadeLocal.edit(oj);

            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "NO SE PUEDE GUARDAR", "HA HABIDO UN ERROR REFRESQUE EL NAVEGADOR O REINICIE SESION");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
    }

    public void onCancel(RowEditEvent event) {
        FacesMessage msg = new FacesMessage("Producto Cancelado", ((ProductosZonasTotal) event.getObject()).getProductoCodigo().getProductoCodigo());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void discontinuado() {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR DE PRODUCTO", "Es Descontinuado o no existe");
        PrimeFaces.current().dialog().showMessageDynamic(message);
    }



    public void codigo() {
        if (getProductoCodigo().length() == 5) {

            try {
                Productos pro = daoPro.porCodigo(getProductoCodigo());
                setProductoNombre(pro.getProductoNombre());
                setProductoCodigo(pro.getProductoCodigo());
                setCodigoBarra(pro.getCodigoBarra());
                proSel = pro;
                if (pro.getProductoNombre().isEmpty()) {
                    discontinuado();
                }
            } catch (Exception e) {
                discontinuado();
            }

        } else {
            //  FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "CODIGO INCORECTO");
            // RequestContext.getCurrentInstance().showMessageInDialog(message);
        }
    }

    public void barra() {
        if (getCodigoBarra().length() == 13) {

            try {
                Productos pro = daoPro.finfByCodigoBarra(getCodigoBarra());
                setProductoNombre(pro.getProductoNombre());
                setProductoCodigo(pro.getProductoCodigo());
                proSel = pro;
                if (pro.getProductoNombre().isEmpty()) {
                    discontinuado();
                }
            } catch (Exception e) {
                discontinuado();
            }
        } else {
            //  FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "CODIGO INCORECTO");
            // RequestContext.getCurrentInstance().showMessageInDialog(message);
        }
    }


    public void borarSelection(Integer in) {
        FacesContext context = FacesContext.getCurrentInstance();
        ProductosZonasTotal i = productosZonasTotalFacadeLocal.find(in);
        context.addMessage(null, new FacesMessage("Eliminado", "Producto Eliminado" + i.getProductoCodigo().getProductoNombre()));
        productosZonasTotalFacadeLocal.remove(i);
    }

    public void porNombre(String productoNombre) {
        if (productoNombre.isEmpty()) {
        } else {
            Productos pr = daoPro.busquedaPorNombre(productoNombre);
            if (pr.getDiscontinuado().equals("13")) {
                System.out.println("si es discontinuados");
                discontinuado();
            } else {
                setProductoCodigo(pr.getProductoCodigo());
                setCodigoBarra(pr.getCodigoBarra());
            }
        }
    }

    public void resetVariables() {
        obtenerDatosZonas();

        setProductoCodigo(new String());
        setProductoNombre(new String());
        setCodigoBarra(new String());
        setCajas(new String());
        setUnidades(new String());
        proSel = new Productos();
    }

    public List<Productos> complete(String query) {	        // Assumed Datasource
        List<Productos> q = new ArrayList<>();
        q = productosFacadeLocal.porNombre("%" + query + "%");

        productos = q;
        return q;

    }


    public void seteaVariables2() {

        try {

            if (getProductoCodigo() != null) {
                setProductoNombre(proSel.getProductoNombre());
                setProductoCodigo(proSel.getProductoCodigo());
                setCodigoBarra(proSel.getCodigoBarra());
                if (proSel.getProductoNombre().isEmpty()) {
                    discontinuado();
                }
            }
            // this.productoSelect = producto;
        } catch (Exception e) {

        }

    }

    public void nada(){
        System.out.println("refresca");
    }


    public void guardarSiguiete() {
        try {
            Date ahora = new Date();
            FacesContext context = FacesContext.getCurrentInstance();
            ProductosZonasTotal prz = new ProductosZonasTotal();
            prz.setZona(getZona());
            prz.setProductoCodigo(daoPro.find(getProductoCodigo()));
            prz.setCantidad(Integer.valueOf(getUnidades()));
            prz.setCajas(Integer.valueOf(getCajas()));
            prz.setFecha(getVencimiento());
            prz.setObservacion(getObservaciones());
            prz.setFingreso(ahora);
            prz.setUsuarioCodigo(usuario.getUsuarioCodigo());
            prz.setSucursalCodigo(sucursal.getSucursalCodigo());

            productosZonasTotalFacadeLocal.create(prz);
            context.addMessage(null, new FacesMessage("Guardado", getProductoNombre()));
            resetVariables();
            clearDs();
        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "NO SE PUEDE GUARDAR", "HA HABIDO UN ERROR REFRESQUE EL NAVEGADOR O REINICIE SESION");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
    }

    private void clearDs() {

        this.zona = "";
        this.unidades = "";
        this.cajas = "";
        this.vencimiento = "";
        this.observaciones = "";

    }

    public void existenciaFisica() {

        ProductosucursalPK pk = new ProductosucursalPK();
        Productosucursal pr = new Productosucursal();


        for (ZonasVsActual i : listaResultadoZonas) {
            pk.setSucursalCodigo(sucursal.getSucursalCodigo());
            pk.setProductoCodigo(i.getProductoCodigo());
            pr = daoA.Obpro(pk);
            System.out.println("tricoder antes " + pr.getProductoSucursalFisica());
            pr.setProductoSucursalFisica(i.getUnidades().intValue());
            System.out.println("tricoder despues " + pr.getProductoSucursalFisica());
            daoA.updateSucursal(pr);
        }

        addMessage("Inventario Modificado", "Campos de Existencia Fisica Actualizada");
    }

    public void addMessage(String summary, String detalle) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detalle);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

}
