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

import com.cosmodas.EntCosmos.Pedidos;
import com.cosmodas.EntCosmos.*;
import com.cosmodas.FacadeCosmos.*;
import com.cosmodas.validaciones.CuerpoEtiquetas;

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.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.primefaces.PrimeFaces;

/**
 * @author obper
 */
@Named(value = "betiquetas")
@ViewScoped
public class Betiquetas implements Serializable {

    private String consultorCodigo = new String();
    private String nombreCliente;
    private String direccion;
    private String cantidadEmpaque = "1";
    private String zonaReparto;
    private String salida;
    private String tipoEmpaque;
    private String territorioCodigo;
    private String programaCodigo;
    private boolean desabilitaInplaces = true;
    private boolean bolsaCaja = true;
    private int cantidadAdicional;
    private ExternalContext exc;
    private Integer tipoReparto;
    private Pedidos pedidoSe;
    @Inject
    private WcUsuarios user;
    @Inject
    private Sucursales sucursal;
    @Inject
    private ConsultoresDatosReparto consultoresDatosReparto;
    //*************************************
    private ConsultoresDatos consultorDato;
    private JasperPrint jasperPrint;
    private RutaReparto rutaReparto = new RutaReparto();
    private RepartoEmpaque repartoEmpaque;
    private DatosCosultoresCompletosFacturacion consultor;
    private List<RutaReparto> rutasRepartoTerritorio = new ArrayList<>();
    private List<CuerpoEtiquetas> listaEtiquetas;
    //*************************************
    @EJB
    private RutaRepartoFacadeLocal rutaFacadeLocal;
    @EJB
    private GeneralesFacadeLocal gfl;
    @EJB
    private ConsultoresFacadeLocal conf;
    @EJB
    private ConsultoresDatosFacadeLocal cdf;
    @EJB
    private RepartoEmpaqueFacadeLocal empaqueFacadeLocal;
    @EJB
    private VEtiquetasFacadeLocal vetiqueFacade;
    @EJB
    private SucursalesFacadeLocal daoFact;
    @EJB
    private DatosCosultoresCompletosFacturacionFacadeLocal cdcffl;
    @EJB
    private ConsultoresDatosRepartoDaoLocal cdrdl;


//*************************************

    public String getConsultorCodigo() { /// valida info
        return consultorCodigo;
    }

    public void setConsultorCodigo(String consultorCodigo) {
        //obternerRutaReparto(consultorCodigo);
        this.consultorCodigo = consultorCodigo.toUpperCase();
    }

    public Integer getTipoReparto() {
        return tipoReparto;
    }

    public void setTipoReparto(Integer tipoReparto) {
        this.tipoReparto = tipoReparto;
    }

    public ConsultoresDatosReparto getConsultoresDatosReparto() {
        return consultoresDatosReparto;
    }

    public void setConsultoresDatosReparto(ConsultoresDatosReparto consultoresDatosReparto) {
        this.consultoresDatosReparto = consultoresDatosReparto;
    }

    public String getNombreCliente() {
        return nombreCliente;
    }

    public void setNombreCliente(String nombreCliente) {
        this.nombreCliente = nombreCliente;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getCantidadEmpaque() {
        return cantidadEmpaque;
    }

    public void setCantidadEmpaque(String cantidadEmpaque) {
        this.cantidadEmpaque = cantidadEmpaque;
    }

    public String getZonaReparto() {
        return zonaReparto;
    }

    public void setZonaReparto(String zonaReparto) {
        this.zonaReparto = zonaReparto;
    }

    public String getTipoEmpaque() {
        return tipoEmpaque;
    }

    public void setTipoEmpaque(String tipoEmpaque) {
        this.tipoEmpaque = tipoEmpaque;
    }

    public JasperPrint getJasperPrint() {
        return jasperPrint;
    }

    public void setJasperPrint(JasperPrint jasperPrint) {
        this.jasperPrint = jasperPrint;
    }

    public RutaReparto getRutaReparto() {
        return rutaReparto;
    }

    public void setRutaReparto(RutaReparto rutaReparto) {
        this.rutaReparto = rutaReparto;
    }

    public RepartoEmpaque getRepartoEmpaque() {
        return repartoEmpaque;
    }

    public void setRepartoEmpaque(RepartoEmpaque repartoEmpaque) {
        this.repartoEmpaque = repartoEmpaque;
    }

    public DatosCosultoresCompletosFacturacion getConsultor() {
        return consultor;
    }

    public void setConsultor(DatosCosultoresCompletosFacturacion consultor) {
        this.consultor = consultor;
    }

    public List<RutaReparto> getRutasRepartoTerritorio() {
        return rutasRepartoTerritorio;
    }

    public void setRutasRepartoTerritorio(List<RutaReparto> rutasRepartoTerritorio) {
        this.rutasRepartoTerritorio = rutasRepartoTerritorio;
    }

    public String getTerritorioCodigo() {
        return territorioCodigo;
    }

    public void setTerritorioCodigo(String territorioCodigo) {
        this.territorioCodigo = territorioCodigo;
    }

    public boolean isDesabilitaInplaces() {
        return desabilitaInplaces;
    }

    public void setDesabilitaInplaces(boolean desabilitaInplaces) {
        this.desabilitaInplaces = desabilitaInplaces;
    }

    public ConsultoresDatos getConsultorDato() {
        return consultorDato;
    }

    public void setConsultorDato(ConsultoresDatos consultorDato) {
        this.consultorDato = consultorDato;
    }

    public WcUsuarios getUser() {
        return user;
    }

    public void setUser(WcUsuarios user) {
        this.user = user;
    }

    public String getProgramaCodigo() {
        return programaCodigo;
    }

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

    public boolean isBolsaCaja() {
        return bolsaCaja;
    }

    public void setBolsaCaja(boolean bolsaCaja) {
        this.bolsaCaja = bolsaCaja;
    }

    //********************************************************
    @PostConstruct
    public void init() {
        this.pedidoSe = new Pedidos();
        exc = FacesContext.getCurrentInstance().getExternalContext();
        user = (WcUsuarios) exc.getSessionMap().get("usuario");
        sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        programaCodigo = gfl.findAll().get(0).getPrograma();
        this.zonaReparto = "-------";
        try {
            this.consultor = (DatosCosultoresCompletosFacturacion) exc.getSessionMap().get("consultor");
            pedidoSe = (Pedidos) exc.getSessionMap().get("pedidoSe");

            this.consultorCodigo = consultor.getConsultorCodigo();
            this.consultoresDatosReparto = cdrdl.obtenerDatoReparto(consultor.getConsultorCodigo());
            obternerRutaReparto();
            if(pedidoSe.getTipoReparto() ==2|| pedidoSe.getTipoReparto()==5){

                cantidadEmpaque = (String) exc.getSessionMap().get("cantidadCAEX");
            }
        } catch (Exception e) {
        }

    }

    public void cambioTipoEmpaque() {

        if (tipoEmpaque.equalsIgnoreCase("CAJA")) {
            setBolsaCaja(false);
            setCantidadEmpaque("");
        } else {
            setCantidadEmpaque("1");
            setBolsaCaja(true);
        }
        // this.tipoEmpaque = tipoEmpaque;
    }

    public void cambioTipoRuta() {

        switch (tipoReparto) {
            case 0:
                zonaReparto = "DESPACHAR EN OFICINA";
                break;
            case 1:
                zonaReparto = "LLEVARA SUPERVISORA";
                break;
            case 2:
                zonaReparto = "CAEX DIR: "+  rutaReparto.getDireccion();
                this.tipoEmpaque = "CAJA";
                cambioTipoEmpaque();
                break;
            case 3:
                this.zonaReparto = rutaReparto.getDireccion();
                break;
            case 4:
                zonaReparto = "CxC "+ rutaReparto.getRuta()+" - "+  rutaReparto.getDireccion();
                this.tipoEmpaque = "CAJA";
                cambioTipoEmpaque();
                break;
            case 5:
                zonaReparto = "COMPLEMENTOS - "+  rutaReparto.getDireccion();
                this.zonaReparto = rutaReparto.getDireccion();
                break;
            default:
                this.zonaReparto = "SELECCIONE TIPO REPARTO";
                break;

        }

    }

    public void obternerRutaReparto() {

        if (consultorCodigo.length() == 6) {

            try {
                ConsultoresDatosReparto datoReparto = cdrdl.obtenerDatoReparto(consultorCodigo);

                this.consultor = cdcffl.busquedaDato(consultorCodigo);
                this.consultoresDatosReparto = datoReparto;
                this.consultorCodigo = getConsultor().getConsultorCodigo();
                this.nombreCliente = consultor.getNombreConsultor();
                this.territorioCodigo = consultor.getTerritorioCodigo();
                this.rutasRepartoTerritorio = rutaFacadeLocal.rutaRepartoListas(consultor.getTerritorioCodigo());
                this.consultorDato = cdf.DatosDeConsultor(consultorCodigo);

                this.rutaReparto = rutaFacadeLocal.find(datoReparto.getCorrelativo_reparto());

                if (!Objects.isNull(pedidoSe)) {
                    tipoReparto = pedidoSe.getTipoReparto();
                }

                if (!Objects.isNull(tipoReparto)) {
                    cambioTipoRuta();
                }


            } catch (Exception e) {
                System.err.println(e);
            }
        }

    }

    public void imprimirEtiqueta(int cantidad) {
        List<CuerpoEtiquetas> cel = new ArrayList<>();

        CuerpoEtiquetas ce = new CuerpoEtiquetas();
        ce.setCajasDd(String.valueOf(cantidad));
        ce.setCantidadCajas(getCantidadEmpaque());
        ce.setDireccion(consultoresDatosReparto.getDireccionReparto());
        ce.setCodigo(getConsultorCodigo());
        ce.setNombres(consultor.getNombreConsultor());
        ce.setApellidos(consultor.getNombreConsultor());
        ce.setRuta(getZonaReparto());
        ce.setTelefono(getConsultor().getConsultorTelefonoResidencia());
        ce.setTelefono2(consultoresDatosReparto.getTelefonoContacto());
        ce.setTerritorio("T" + getConsultor().getTerritorioCodigo());
        ce.setUsuario(getUser().getUsuarioNombre());
        ce.setColor(getRutaReparto().getColor());

        cel.add(ce);

        this.listaEtiquetas = cel;

    }

    public void guardarRutaReparto() {

        try {
            ConsultoresDatos cs = getConsultorDato();

            cs.setCorrelativoReparto(getRutaReparto().getCodigo());
            cs.setZonaReparto(getRutaReparto().getDireccion());

            cdf.edit(cs);

        } catch (Exception e) {
        }

    }

    public void fillReport() throws JRException {
        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(listaEtiquetas);
        String reportPath = "/opt/reportesJasper/etiquetas.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        //this.salida = jasperReport.toString();
        Map parametros = new HashMap();
        jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);
    }

    public void pdfImpre() throws JRException, IOException {

        boolean impreDo = true;
        RepartoEmpaque remp = new RepartoEmpaque();
        try {
            remp = empaqueFacadeLocal.busquedaEtiqueta(getConsultorCodigo(), getProgramaCodigo());
            impreDo = false;
        } catch (Exception e) {
        }

        if (Objects.isNull(remp) || (impreDo && remp.getCantidad() == 0)|| tipoReparto == 4) {

            try {
                VEtiquetas ve = new VEtiquetas();
                ve = vetiqueFacade.find(consultorCodigo);
                if (ve != null) {
                    int catidadEm = Integer.valueOf(getCantidadEmpaque());
                    for (int i = 1; i <= catidadEm; i++) {
                        imprimirEtiqueta(i);
                        fillReport();
                        //JasperPrintManager.printReport(jasperPrint, false);

                        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/etiquetas/" + getConsultorCodigo() + "-" + getProgramaCodigo() + "-" + i + ".pdf");
                        impresionLinux("/opt/etiquetas/" + getConsultorCodigo() + "-" + getProgramaCodigo() + "-" + i + ".pdf", "ETIQUETAS-" + sucursal.getSucursalCodigo());
                    }

                    try {

                        if (tipoReparto == 3) {
                            RepartoEmpaque repam = new RepartoEmpaque();
                            repam.setCantidad(catidadEm);
                            repam.setCodigoPrograma(getProgramaCodigo());
                            repam.setConsultorCodigo(getConsultorCodigo());
                            repam.setTipoEmpaque(getTipoEmpaque());
                            repam.setTipoe(tipoReparto);
                            repam.setSucursalCodigo(sucursal.getSucursalCodigo());
                            empaqueFacadeLocal.create(repam);
                            FacesContext context = FacesContext.getCurrentInstance();
                            context.addMessage(null, new FacesMessage("Exito!!", " Etiqueta de consultor " + getConsultorCodigo() + " eviada correctamente"));
                        }

                    } catch (Exception e) {
                        System.err.println("no se puede insertar empaque");
                    }
                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Etiqueta!!", " Etiqueta de consultor " + getConsultorCodigo() + " Enviada correctamente"));

                } else {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "SIN FACTURAS", "EL CONSULTOR NO POSEE FACTURAS");
                    PrimeFaces.current().dialog().showMessageDynamic(message);
                }

            } catch (Exception e) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "EL CONSULTOR NO POSEE FACTURAS");
                PrimeFaces.current().dialog().showMessageDynamic(message);
            }
        } else {

            PrimeFaces.current().executeScript("PF('etiquetas').hide();");
            PrimeFaces.current().executeScript("PF('myDialogVar').show();");

        }

    }

    public void impresionLinux(String doc, String nombreImpresor) {

        try {
            System.out.println(doc);
            System.out.println(nombreImpresor);
            Runtime.getRuntime().exec("lp -o  media=Custom.105x216mm -d " + nombreImpresor + " " + doc);
        } catch (IOException e) {
            System.out.println("EXCEPTION: " + e.getMessage());
        }
    }

    public void validaEtiqueta(Consultores consultor) {

    }

    public Betiquetas() {
    }

    public void reimpre(String in) throws JRException {

        FacesContext context = FacesContext.getCurrentInstance();
        boolean impreDo = true;
        RepartoEmpaque remp = new RepartoEmpaque();
        int cantAdd = remp.getCantidad();
        try {
            remp = empaqueFacadeLocal.busquedaEtiqueta(getConsultorCodigo(), getProgramaCodigo());
        } catch (Exception e) {
        }

        switch (in) {
            case "SUMAR":
                tipo(Integer.valueOf(getCantidadEmpaque()), remp);
                break;
            case "RESTAR":
                tipo(Integer.valueOf("-" + getCantidadEmpaque()), remp);
                break;
            case "REIMPRIMIR":
                setCantidadEmpaque(String.valueOf(remp.getCantidad()));
                for (int i = 1; i <= remp.getCantidad(); i++) {
                    imprimirEtiqueta(i);
                    fillReport();
                    JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/etiquetas/" + getConsultorCodigo() + "-" + getProgramaCodigo() + "-" + i + ".pdf");
                    impresionLinux("/opt/etiquetas/" + getConsultorCodigo() + "-" + getProgramaCodigo() + "-" + i + ".pdf", "ETIQUETAS-" + sucursal.getSucursalCodigo());
                }
                break;
            case "BOXTOBAGE":
                remp.setTipoEmpaque("BOLSA");
                remp.setCantidad(1);
                setCantidadEmpaque("1");

                context.addMessage(null, new FacesMessage("cambiado a bolsa", " se cambio a bolsa por lo cual se permite 1 bolsa"));

                ;
            case "BAGETOBOX":
                remp.setTipoEmpaque("CAJA");
                remp.setCantidad(Integer.valueOf(getCantidadEmpaque()));

                context.addMessage(null, new FacesMessage("cambiado a Caja", " Etiqueta de consultor " + getConsultorCodigo() + " cambio a CAJA"));
                ;

        }
        context.addMessage(null, new FacesMessage("Reimpresion!!", " Etiqueta de consultor " + getConsultorCodigo() + " Reimpresa correctamente" + sucursal.getSucursalCodigo()));
    }

    private void tipo(Integer itt, RepartoEmpaque remp) {
        if (getTipoEmpaque().equalsIgnoreCase("CAJA") && (remp.getCantidad() + itt) > 0) {
            setCantidadEmpaque(String.valueOf(remp.getCantidad() + itt));
            try {
                VEtiquetas ve = new VEtiquetas();
                ve = vetiqueFacade.find(consultorCodigo);
                if (ve != null) {
                    int catidadEm = remp.getCantidad() + itt;
                    for (int i = 1; i <= catidadEm; i++) {
                        imprimirEtiqueta(i);
                        fillReport();
                        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/etiquetas/" + getConsultorCodigo() + "-" + getProgramaCodigo() + "-" + i + ".pdf");
                        impresionLinux("/opt/etiquetas/" + getConsultorCodigo() + "-" + getProgramaCodigo() + "-" + i + ".pdf", "ETIQUETAS-" + sucursal.getSucursalCodigo());

                    }

                    try {

                        remp.setCantidad(catidadEm);
                        remp.setTipoEmpaque(getTipoEmpaque());

                        empaqueFacadeLocal.edit(remp);
                        FacesContext context = FacesContext.getCurrentInstance();
                        context.addMessage(null, new FacesMessage("ENVIADO", " Etiqueta de consultor " + getConsultorCodigo() + " eviada correctamente"));

                    } catch (Exception e) {
                        System.err.println("no se puede insertar empaque");
                    }

                } else {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "SIN FACTURAS", "EL CONSULTOR NO POSEE FACTURAS");
                    PrimeFaces.current().dialog().showMessageDynamic(message);
                }

            } catch (Exception e) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "EL CONSULTOR NO POSEE FACTURAS");
                PrimeFaces.current().dialog().showMessageDynamic(message);
            }
        } else {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "BOLSAS NO SE PUEDE SUMAR O RESTAR");
            PrimeFaces.current().dialog().showMessageDynamic(message);
        }
    }

}
