/*
 * 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.FacadeCosmos.ProductosFacadeLocal;
import com.cosmodas.FacadeCosmos.ProductosZonasTotalFacadeLocal;
import com.cosmodas.FacadeCosmos.VZonasFacadeLocal;
import com.cosmodas.EntCosmos.Productos;
import com.cosmodas.EntCosmos.ProductosZonasTotal;
import com.cosmodas.EntCosmos.Sucursales;
import com.cosmodas.EntCosmos.VZonas;
import com.cosmodas.EntCosmos.WcUsuarios;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.PrimeFaces;
import org.primefaces.event.RowEditEvent;

/**
 *
 * @author obper
 */
@Named
@ViewScoped
public class bzonas implements Serializable {

    private ProductosZonasTotal proZon = new ProductosZonasTotal();
    @EJB
    ProductosFacadeLocal daoPro;
    @EJB
    ProductosZonasTotalFacadeLocal productosZonasTotalFacadeLocal;
    @EJB
    VZonasFacadeLocal vzfl;

    private String[] zonas;
    private SelectItem[] zonasSelect;
    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 = "Ninguna";
    private ProductosZonasTotal proEdit;
    private List<ProductosZonasTotal> ListaZonas;
    private ExternalContext exc;

    @Inject
    private Sucursales sucursal;
    @Inject
    private WcUsuarios usuario;

    //--------------------
    @PostConstruct
    public void init() {
        this.exc = FacesContext.getCurrentInstance().getExternalContext();
        this.sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        this.usuario = (WcUsuarios) exc.getSessionMap().get("usuario");

        List<VZonas> zon = vzfl.busquedaSucursal(sucursal.getSucursalCodigo());
        this.ListaZonas = productosZonasTotalFacadeLocal.productosPorSucursal(sucursal.getSucursalCodigo());

        Integer tamanoZona = zon.size();

        zonas = new String[zon.size()];

        for (int i = 0; i < zon.size(); i++) {
            zonas[i] = zon.get(i).getZona();

        }
        zonasSelect = createFilterOptions(zonas);
    }

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

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

    //----------------------
    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;
    }

    private SelectItem[] createFilterOptions(String[] data) {
        SelectItem[] options = new SelectItem[data.length + 1];
        options[0] = new SelectItem("", "Select");
        for (int i = 0; i < data.length; i++) {
            options[i + 1] = new SelectItem(data[i], data[i]);
        }
        return options;
    }

    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().isEmpty() && getProductoCodigo().length() == 5) {

            try {
                Productos pro = daoPro.porCodigo(getProductoCodigo());

                if (pro.getProductoNombre().isEmpty()) {
                    discontinuado();
                }
                System.out.println("no es discontinuados");
                setProductoNombre(pro.getProductoNombre());
                setProductoCodigo(pro.getProductoCodigo());
                setCodigoBarra(pro.getCodigoBarra());
                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().isEmpty() && getCodigoBarra().length() == 13) {

            try {
                Productos pro = daoPro.finfByCodigoBarra(getCodigoBarra());
                setProductoNombre(pro.getProductoNombre());
                setProductoCodigo(pro.getProductoCodigo());
                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 SelectItem[] getZonasSelect() {
        return zonasSelect;
    }

    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() {
        setProductoCodigo(new String());
        setProductoNombre(new String());
        setCodigoBarra(new String());
        setCajas(new String());
        setUnidades(new String());
    }

    public List<String> complete(String query) {	        // Assumed Datasource
        List<Productos> q = new ArrayList<>();
        q = daoPro.porNombre("%" + query + "%");
        setProduct(q);
        List ai = new ArrayList();
        for (Productos i : q) {
            ai.add(i.getProductoNombre());
        }
        setProduc(ai);
        return ai;
    }

    public void asigProNom(String ProductoCodigo) {
        Productos j = daoPro.porCodigo(ProductoCodigo);
        System.out.println("codigo" + ProductoCodigo);
    }

    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 bzonas() {
    }

}
