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

import com.cosmodas.FacadeCosmos.GeneralesFacadeLocal;
import com.cosmodas.FacadeCosmos.VproductosRequisicionFacadeLocal;
import com.cosmodas.FacadeCosmos.WcDetalleRequisicionProductoFacadeLocal;
import com.cosmodas.FacadeCosmos.WcRequisicionProductoFacadeLocal;
import com.cosmodas.EntCosmos.Sucursales;
import com.cosmodas.EntCosmos.VproductosRequisicion;
import com.cosmodas.EntCosmos.WcDetalleRequisicionProducto;
import com.cosmodas.EntCosmos.WcDetalleRequisicionProductoPK;
import com.cosmodas.EntCosmos.WcRequisicionProducto;
import com.cosmodas.EntCosmos.WcUsuarios;
import java.io.IOException;
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.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.primefaces.PrimeFaces;

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

    @EJB
    VproductosRequisicionFacadeLocal vprfl;
    @EJB
    WcRequisicionProductoFacadeLocal wcrfl;
    @EJB
    WcDetalleRequisicionProductoFacadeLocal wcdrfl;
    @EJB
    GeneralesFacadeLocal generalesDao;

    private boolean nuevoPedido;
    private Integer cantidad;
    private String observaciones;
    private String salaEmite;
    private String numeroPedido;
    private String productoCodigo;
    private String nombreProducto;
    private String usuarioCodigo;
    private CuerpoRequisicionData pedido;
    private String programaCodigo;
    private Integer existenciaActual;
    private Integer ventas;
    private String correoEnviar;
    private String numeroRequsicion;
    private String cantidadString;
    private List<CuerpoRequisicionData> detallePedido;
    private boolean disableDeTomaProdut;
    private boolean validaListaOfertas;
    private String observacion;
    private ExternalContext exc;
    private List<VproductosRequisicion> productos;

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

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

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

    public Integer getExistenciaActual() {
        return existenciaActual;
    }

    public void setExistenciaActual(Integer existenciaActual) {
        this.existenciaActual = existenciaActual;
    }

    public Integer getVentas() {
        return ventas;
    }

    public void setVentas(Integer ventas) {
        this.ventas = ventas;
    }

    public String getNumeroRequsicion() {
        return numeroRequsicion;
    }

    public void setNumeroRequsicion(String numeroRequsicion) {
        this.numeroRequsicion = numeroRequsicion;
    }

    public boolean isNuevoPedido() {
        return nuevoPedido;
    }

    public void setNuevoPedido(boolean nuevoPedido) {
        this.nuevoPedido = nuevoPedido;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public String getObservaciones() {
        return observaciones;
    }

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

    public String getSalaEmite() {
        return salaEmite;
    }

    public void setSalaEmite(String salaEmite) {
        this.salaEmite = salaEmite;
    }

    public String getNumeroPedido() {
        return numeroPedido;
    }

    public void setNumeroPedido(String numeroPedido) {
        this.numeroPedido = numeroPedido;
    }

    public String getProductoCodigo() {
        return productoCodigo;
    }

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

    public String getNombreProducto() {
        return nombreProducto;
    }

    public void setNombreProducto(String nombreProducto) {
        this.nombreProducto = nombreProducto;
    }

    public String getUsuarioCodigo() {
        return usuarioCodigo;
    }

    public void setUsuarioCodigo(String usuarioCodigo) {
        this.usuarioCodigo = usuarioCodigo;
    }

    public CuerpoRequisicionData getPedido() {
        return pedido;
    }

    public void setPedido(CuerpoRequisicionData pedido) {
        this.pedido = pedido;
    }

    public String getProgramaCodigo() {
        return programaCodigo;
    }

    public void setProgramaCodigo(String programaCodigo) {
        this.programaCodigo = programaCodigo;
    }

    public String getCorreoEnviar() {
        return correoEnviar;
    }

    public void setCorreoEnviar(String correoEnviar) {
        this.correoEnviar = correoEnviar;
    }

    public String getCantidadString() {
        return cantidadString;
    }

    public void setCantidadString(String cantidadString) {
        this.cantidadString = cantidadString;
    }

    public List<CuerpoRequisicionData> getDetallePedido() {
        return detallePedido;
    }

    public void setDetallePedido(List<CuerpoRequisicionData> detallePedido) {
        this.detallePedido = detallePedido;
    }

    public boolean isDisableDeTomaProdut() {
        return disableDeTomaProdut;
    }

    public void setDisableDeTomaProdut(boolean disableDeTomaProdut) {
        this.disableDeTomaProdut = disableDeTomaProdut;
    }

    public boolean isValidaListaOfertas() {
        return validaListaOfertas;
    }

    public void setValidaListaOfertas(boolean validaListaOfertas) {
        this.validaListaOfertas = validaListaOfertas;
    }

    public String getObservacion() {
        return observacion;
    }

    public void setObservacion(String observacion) {
        this.observacion = observacion;
    }

    public ExternalContext getExc() {
        return exc;
    }

    public void setExc(ExternalContext exc) {
        this.exc = exc;
    }

    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 nuevaRequsicion() {
        this.nuevoPedido = false;

    }

    public VproductosRequisicion getProducto() {
        return producto;
    }

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

    @PostConstruct
    public void init() {

        exc = FacesContext.getCurrentInstance().getExternalContext();
        usuario = (WcUsuarios) exc.getSessionMap().get("usuario");
        sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        this.producto = new VproductosRequisicion();
        this.existenciaActual = 0;
        this.ventas = 0;
        nuevoPedido = false;
        this.detallePedido = new ArrayList<>();
        this.productos = new ArrayList<>();
        this.programaCodigo = generalesDao.findAll().get(0).getPrograma();
        usuario = (WcUsuarios) exc.getSessionMap().get("usuario");
    }

    public void nuevoPedidoButton() {

        if (!nuevoPedido) {
            nuevoPedido = true;
        }
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Iniciando nuevo pedido"));

    }

    public void obtenerProducto() {
        if (productoCodigo.length() == 0 || productoCodigo == null) {
        } else if (productoCodigo.length() == 5) {
            producto = vprfl.busquedaPorCodigo(sucursal.getSucursalCodigo(), programaCodigo, productoCodigo);
            // productos.add(producto);
            ventas = Integer.parseInt(producto.getVendidos().toString());
            existenciaActual = producto.getActual();

        } else if (productoCodigo.length() != 5) {

            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Codigo de producto Incorrecto", "ingrese codigo correto");
            PrimeFaces.current().dialog().closeDynamic(message);

        }
    }

    public void createNew() {
        //nuevoProducto();
        if (detallePedido.isEmpty()) {
            detallePedido.add(pedido);
        } else if (validaExistenciaPedido()) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "DUPLICADO", "El producto Ya esta en la Factura");
            PrimeFaces.current().dialog().closeDynamic(message);
        } else {
            detallePedido.add(pedido);
            pedido = new CuerpoRequisicionData();
        }
        this.producto = new VproductosRequisicion();
    }

    public boolean validaExistenciaPedido() {

        for (CuerpoRequisicionData i : detallePedido) {

            boolean out = i.getProductoCodigo().equals(producto.getProductoCodigo());

            if (out) {
                return true;
            }

        }
        return false;
    }

    public List<VproductosRequisicion> complete(String query) {

        List<VproductosRequisicion> q = new ArrayList<>();
        List<VproductosRequisicion> rs = new ArrayList<>();
        try {
            q = vprfl.busquedaPorNombre(sucursal.getSucursalCodigo(), programaCodigo, "%" + query + "%");
        } catch (Exception e) {
        }

        productos = q;
        return q;
    }

    public void nuevoProducto() {
        Integer cantidad1 = Integer.valueOf(cantidadString);

        CuerpoRequisicionData cue = new CuerpoRequisicionData();
        VproductosRequisicion pof = vprfl.busquedaPorCodigo(sucursal.getSucursalCodigo(), programaCodigo, productoCodigo);

        setProducto(pof);

        cue.setCantidadEnviada(0);

        cue.setProductoNombre(pof.getProducto());
        cue.setExistencias(existenciaActual);
        cue.setCantidadPedida(cantidad1);
        cue.setProductoCodigo(pof.getProductoCodigo());

        this.pedido = cue;

        setPedido(cue);
    }

    public void borrar() {
        this.producto = new VproductosRequisicion();
        this.productoCodigo = new String();
        this.cantidadString = new String();
        this.ventas = 0;
        this.existenciaActual = 0;
        pedido = new CuerpoRequisicionData();
    }

    public void mensajeInfo(String titulo, String detalle){
        nuevoMensajeGrowl(FacesMessage.SEVERITY_INFO, titulo, detalle);
    }

    public void mensajeAlerta(String titulo, String detalle) {
        nuevoMensajeGrowl(FacesMessage.SEVERITY_WARN,  titulo, detalle);
    }

    public void mensajeError(String titulo, String detalle) {
        nuevoMensajeGrowl(FacesMessage.SEVERITY_ERROR,  titulo, detalle);
    }

    public void guardarRequicion() {

        WcRequisicionProducto recab = new WcRequisicionProducto();
        //    List<WcDetalleRequicion> dre = new ArrayList<>();

        recab.setCajas(0);
        recab.setDespachadaB(false);
        recab.setLeidaB(false);
        recab.setProgramaRequisicion(programaCodigo);
        recab.setSalaOrigen(sucursal.getSucursalCodigo());
        recab.setIngresada(new Date());
        recab.setUserRequiere(usuario.getUsuarioCodigo());

        wcrfl.create(recab);

        for (CuerpoRequisicionData cus : detallePedido) {

            WcDetalleRequisicionProducto dre = new WcDetalleRequisicionProducto();
            WcDetalleRequisicionProductoPK drepk = new WcDetalleRequisicionProductoPK();
            drepk.setIdReq(recab.getIdReq());
            drepk.setProductoCodigo(cus.getProductoCodigo());

            dre.setCantidadEnviada(0);
            dre.setCantidadPedida(cus.getCantidadPedida());
            dre.setTipoProducto(0);
            dre.setWcDetalleRequisicionProductoPK(drepk);
            wcdrfl.create(dre);

        }

        numeroPedido = recab.getIdReq().toString();

        PrimeFaces.current().executeScript("PF('numeroPedTra').show();");

    }

    public void refresh() throws IOException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        context.redirect("nuevaRequisision.jsf");

    }

    public void soloActulu() {

        System.out.println(observaciones);
    }

    public void seteaVariables2() {

        try {

            if (producto.getProductoCodigo() != null) {
                productoCodigo = producto.getProductoCodigo();
                ventas = Integer.parseInt(producto.getVendidos().toString());
                existenciaActual = producto.getActual();
            }
            // this.productoSelect = producto;
        } catch (Exception e) {

        }
        System.out.println("hola");
    }

    public void nuevoMensajeGrowl(FacesMessage.Severity severity, String summary, String detail) {
        FacesContext.getCurrentInstance().
                addMessage(null, new FacesMessage(severity, summary, detail));
    }
}
