/*
 * 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.*;
import com.cosmodas.EntCosmos.Consultores;
import com.cosmodas.EntCosmos.DatosCosultoresCompletos;
import com.cosmodas.EntCosmos.Territorios;
import com.cosmodas.EntCosmos.VProcesodepedidos;
import com.cosmodas.EntCosmos.Sucursales;
import com.cosmodas.EntCosmos.WcUsuarios;
import com.cosmodas.EntCosmos.proKardex;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
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.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.ColorSupported;
import javax.print.attribute.standard.PrinterName;
import javax.servlet.http.HttpServletResponse;

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

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

    @EJB
    DatosCosultoresCompletosFacadeLocal dccfl;
    @EJB
    ProcesoDePedidosFacadeLocal propeddfl;
    @EJB
    TerritoriosFacadeLocal terfl;
    @EJB
    VProcesodepedidosFacadeLocal vprofl;
    @EJB
    ConsultoresFacadeLocal cflo;
    @EJB
    SucursalesFacadeLocal daoSucursalLo;
    @EJB
    CargosFacadeLocal cafl;

    private List<VProcesodepedidos> pedidosCreditos;
    private String archiNuevoPdf;
    private List<proKardex> listKardex;
    private VProcesodepedidos procSelecKar;
    private VProcesodepedidos procSelecKarAnula;
    private Consultores consultorSelect;
    private VProcesodepedidos incioPreparcionSele;
    private VProcesodepedidos despachoPreparcionSele;
    private Date fechaInicioBusqueda;
    private Date fechafinBusqueda;
    private JasperPrint jasperPrint;
    private String alarmaCreditos;
    private String filtoReporteDespacho;
    private String consultorCodigoString;
    private String alarmaDespacho;
    private Boolean reparto;
    private String[] selectTerritorio;
    private Boolean despacho;
    private DatosCosultoresCompletos consultorCodigoSelect;
    private List<Territorios> territorios;
    private ExternalContext exc;
    @Inject
    private Sucursales sucursal;
    @Inject
    private WcUsuarios usuario;

    public VProcesodepedidos getProcSelecKarAnula() {
        return procSelecKarAnula;
    }

    public void setProcSelecKarAnula(VProcesodepedidos procSelecKarAnula) {
        this.procSelecKarAnula = procSelecKarAnula;
    }

    public String getConsultorCodigoString() {
        return consultorCodigoString;
    }

    public void setConsultorCodigoString(String consultorCodigoString) {
        this.consultorCodigoString = consultorCodigoString;
    }

    public VProcesodepedidos getIncioPreparcionSele() {
        return incioPreparcionSele;
    }

    public void setIncioPreparcionSele(VProcesodepedidos incioPreparcionSele) {
        this.incioPreparcionSele = incioPreparcionSele;
    }

    public Consultores getConsultorSelect() {
        return consultorSelect;
    }

    public void setConsultorSelect(Consultores consultorSelect) {
        this.consultorSelect = consultorSelect;
    }

    public DatosCosultoresCompletos getConsultorCodigoSelect() {
        return consultorCodigoSelect;
    }

    public void setConsultorCodigoSelect(DatosCosultoresCompletos consultorCodigoSelect) {
        this.consultorCodigoSelect = consultorCodigoSelect;
    }

    public List<VProcesodepedidos> getPedidosCreditos() {
        return pedidosCreditos;
    }

    public void setPedidosCreditos(List<VProcesodepedidos> pedidosCreditos) {
        this.pedidosCreditos = pedidosCreditos;
    }

    public String getArchiNuevoPdf() {
        return archiNuevoPdf;
    }

    public void setArchiNuevoPdf(String archiNuevoPdf) {
        this.archiNuevoPdf = archiNuevoPdf;
    }

    public List<proKardex> getListKardex() {
        return listKardex;
    }

    public void setListKardex(List<proKardex> listKardex) {
        this.listKardex = listKardex;
    }

    public VProcesodepedidos getProcSelecKar() {
        return procSelecKar;
    }

    public void setProcSelecKar(VProcesodepedidos procSelecKar) {
        this.procSelecKar = procSelecKar;
    }

    public VProcesodepedidos getDespachoPreparcionSele() {
        return despachoPreparcionSele;
    }

    public void setDespachoPreparcionSele(VProcesodepedidos despachoPreparcionSele) {
        this.despachoPreparcionSele = despachoPreparcionSele;
    }

    public Date getFechaInicioBusqueda() {
        return fechaInicioBusqueda;
    }

    public void setFechaInicioBusqueda(Date fechaInicioBusqueda) {
        this.fechaInicioBusqueda = fechaInicioBusqueda;
    }

    public Date getFechafinBusqueda() {
        return fechafinBusqueda;
    }

    public void setFechafinBusqueda(Date fechafinBusqueda) {
        this.fechafinBusqueda = fechafinBusqueda;
    }

    public JasperPrint getJasperPrint() {
        return jasperPrint;
    }

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

    public String getAlarmaCreditos() {
        return alarmaObtenerCreditos();
    }

    public void setAlarmaCreditos(String alarmaCreditos) {
        this.alarmaCreditos = alarmaCreditos;
    }

    public String getFiltoReporteDespacho() {
        return filtoReporteDespacho;
    }

    public void setFiltoReporteDespacho(String filtoReporteDespacho) {
        this.filtoReporteDespacho = filtoReporteDespacho;
    }

    public String getAlarmaDespacho() {
        return alarmaDespacho;
    }

    public void setAlarmaDespacho(String alarmaDespacho) {
        this.alarmaDespacho = alarmaDespacho;
    }

    public Boolean getReparto() {
        return reparto;
    }

    public void setReparto(Boolean reparto) {
        this.reparto = reparto;
    }

    public Boolean getDespacho() {
        return despacho;
    }

    public void setDespacho(Boolean despacho) {
        this.despacho = despacho;
    }

    public List<Territorios> getTerritorios() {
        return territorios;
    }

    public void setTerritorios(List<Territorios> territorios) {
        this.territorios = territorios;
    }

    public String[] getSelectTerritorio() {
        return selectTerritorio;
    }

    public void setSelectTerritorio(String[] selectTerritorio) {
        this.selectTerritorio = selectTerritorio;
    }

    @PostConstruct
    public void init() {

        Calendar cal1 = Calendar.getInstance();
        cal1.add(Calendar.MONTH, -4);
        cal1.set(Calendar.DATE, 1);

        this.filtoReporteDespacho = "";
        this.fechaInicioBusqueda = cal1.getTime();
        this.fechafinBusqueda = new Date();
        //this.listKardex = new ArrayList<>();

        territorios = terfl.findAll();
        this.pedidosCreditos = new ArrayList();
        this.procSelecKar = new VProcesodepedidos();
        this.consultorCodigoSelect = new DatosCosultoresCompletos();
        this.consultorSelect = new Consultores();
        this.despacho = false;
        this.reparto = false;
        selectTerritorio = new String[territorios.size()];
        int listater = 0;
        exc = FacesContext.getCurrentInstance().getExternalContext();
        this.sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        this.usuario = (WcUsuarios) exc.getSessionMap().get("usuario");

        for (Territorios tr : territorios) {

            if (listater <= territorios.size()) {
                selectTerritorio[listater] = tr.getCodigoTerritorio();
            }

            listater++;
        }

    }

    public void anulaPedido(VProcesodepedidos pedido) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("anulado"));
        vprofl.actualizaAnula(pedido);

    }

    public String obtenerDaosRs(BigDecimal in) {

        String rs = "0.00";

        try {

            rs = in.toString();

        } catch (Exception e) {


        }

        return rs;
    }

    public String obtenerNombre(String codigo) {
        String rs = cflo.ObtenerNombreCompleto(codigo);
        ;
        return rs;
    }

    public void obtenerConsultor(VProcesodepedidos consultor) {
        consultorSelect = cflo.find(consultor.getConsultorCodigo());
        consultorCodigoSelect = dccfl.busquedaDato(consultor.getConsultorCodigo());
        procSelecKar = consultor;

        if (!procSelecKar.getLeePedidoB()) {
            vprofl.actualizaLeepedido(procSelecKar);
        }

    }

    public void busquedaKardex() {

        this.listKardex = daoSucursalLo.findCallKardex(procSelecKar.getConsultorCodigo(), fechaInicioBusqueda, fechafinBusqueda);
        System.out.println("");

    }

    public long diferenciasFecha(Date date1, String unidad) {
        TimeUnit timeUnit = TimeUnit.SECONDS;
        if (unidad.equalsIgnoreCase("min")) {
            timeUnit = TimeUnit.MINUTES;
        }

        long diffInMillies = new Date().getTime() - date1.getTime();
        return timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);
    }

    public String entregaPedidos(Date date) {
        String rs = "";

        if (date.after(new Date())) {
            rs = "POSFECHADO";
        } else {
            rs = "DESPACHAR";
        }

        return rs;

    }

    public String entregaPedidosColor(Date date) {
        String rs = "";

        if (date.after(new Date())) {
            rs = "#ff5555";
        } else {
            rs = "#35ae47";
        }

        return rs;

    }

    public void actualizaPedidos() {

        obtenerPedidos();
    }

    public void obtenerPedidos() {

        this.pedidosCreditos = new ArrayList<>();
        String sucCod = sucursal.getSucursalCodigo();

        int peds = selectTerritorio.length;
        List<VProcesodepedidos> pedidos = new ArrayList<>();

        for (int i = 0; i < peds; i++) {

            if (reparto) {
                try {
                    pedidos.addAll(propeddfl.ObtenerProcesoPedidos(selectTerritorio[i], 1, sucCod));
                } catch (Exception e) {
                }

            }

            if (despacho) {
                try {
                    pedidos.addAll(propeddfl.ObtenerProcesoPedidos(selectTerritorio[i], 0, sucCod));
                } catch (Exception e) {
                }

            }

        }

        if (!pedidos.isEmpty()) {
            pedidosCreditos = pedidos;
        }

    }

    public String pedidoNoLeido(boolean pedidosColor) {

        if (pedidosColor) {
            return "green";
        } else {
            return "red";
        }

    }

    public void mensajes(String tipo) {
        String summary = "";
        switch (tipo) {
            case "reparto":
                summary = reparto ? "Mostrado pedidos Reparto" : "Ocultando pedidos Reparto";
                break;

            case "despacho":
                summary = reparto ? "Mostrado pedidos Despacho" : "Ocultando pedidos Despacho";
                break;
            default:
                break;

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

    public String convCreditos(boolean i) {
        String rs = "CONTADO";
        if (i) {
            rs = "CREDITO";
        }
        return rs;
    }

    public String convActivo(boolean i) {
        String rs = "INACTIVO";
        if (i) {
            rs = "ACTIVO";
        }
        return rs;
    }

    public String convAbierto(boolean i) {
        String rs = "CERRADO";
        if (i) {
            rs = "ABIERTO";
        }
        return rs;
    }

    public String validaEstado(int input) {

        String rs = "--";

        switch (input) {

            case 0:
                rs = "DESPACHO";
                break;
            case 1:
                rs = "SUPERVISORA";
                break;
            case 2:
                rs = "CAEX";
                break;
            case 3:
                rs = "RUTA/PDA";
                break;
            case 4:
                rs = "CASA POR CASA";
                break;
            default:
                break;

        }

        return rs;
    }

    private boolean validaTerritorio(String terrtorio) {
        boolean rs = true;

        switch (terrtorio) {

            case "99":
                rs = false;
                break;
            case "00":
                rs = false;
                break;
            case "91":
                rs = false;
                break;
            case "92":
                rs = false;
                break;
            default:
                break;

        }
        return rs;
    }

    public void aprobarPedido(String tipo, String cosultorCodigo) throws JRException, IOException, PrintException {

        VProcesodepedidos sds = new VProcesodepedidos();
        sds = procSelecKar;

        Boolean saldos = cafl.validaSaldoMesAnteriror(cosultorCodigo);


            switch (tipo) {
                case "credito":

                    if(!saldos||usuario.getUsuarioCodigo().equals("110")||usuario.getGrupoUsuario().getIdGruposUsuarios()==1){
                        if (consultorCodigoSelect.getConsultorEstado() && validaTerritorio(consultorCodigoSelect.getTerritorioCodigo()) && consultorSelect.getConsultorEstado()) {
                            vprofl.actualizaAprobacion(procSelecKar, 1, usuario.getUsuarioCodigo(), creaTicketPDF(sds, 1));
                            mensajeInfo("CLIENTE APROBADO", "Aprobado");
                        } else {
                            mensajeAlerta("VERIFIQUE CREDITOS", "Cliente con problemas");
                        }
                    }else{
                        mensajeAlerta("CLIENTE CON SALDO", "Cliente con saldo del mes anterior");
                    }
                    break;
                case "contado":

                    if(!saldos||usuario.getUsuarioCodigo().equals("110")||usuario.getGrupoUsuario().getIdGruposUsuarios()==1){
                        if (consultorCodigoSelect.getConsultorEstado() && validaTerritorio(consultorCodigoSelect.getTerritorioCodigo()) && consultorSelect.getConsultorEstado()) {
                            vprofl.actualizaAprobacion(procSelecKar, 2, usuario.getUsuarioCodigo(), creaTicketPDF(sds, 2));
                            mensajeInfo("CLIENTE APROBADO", "Aprobado");
                        }else {
                            mensajeAlerta("VERIFIQUE CREDITOS", "Cliente con problemas");
                        }
                    }else{
                        mensajeAlerta("CLIENTE CON SALDO", "Cliente con saldo del mes anterior");
                    }

                    break;
                case "denegado":
                    vprofl.actualizaAprobacion(procSelecKar, 3, usuario.getUsuarioCodigo(), creaTicketPDF(sds, 3));
                    break;
            }

    }

    public String alarmaObtenerCreditos() {
        String ruta = null;

        try {
            for (VProcesodepedidos p : getPedidosCreditos()) {

                if (!p.getLeePedidoB() && p.getFechaHoraRetira().before(new Date())) {
                    ruta = "./../sonidos/alarma.mp3";
                }

            }
        } catch (Exception e) {
        }

        return ruta;
    }

    public int creaTicketPDF(VProcesodepedidos p, int tipoAprobado) throws JRException, IOException, PrintException {
        int rs = Tickec(p, tipoAprobado);
        if (p.getSucursal().equals("02") && !p.getPedidoReparto()) {
            JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pedidos/ticket" + p.getId() + ".pdf");
            HttpServletResponse httpServletResponse
                    = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            // imprimirTicket("ticket" + p.getId() + ".pdf", "1ticket");
            return rs;
        } else if (p.getSucursal().equals("03") && !p.getPedidoReparto()) {
            JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pedidos/ticket" + p.getId() + ".pdf");
            HttpServletResponse httpServletResponse
                    = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            //impresionLinux("ticket" + p.getId() + ".pdf", "2ticket");
            return rs;
        } else {

            return 0;
        }

    }

    public void impresionLinux(String doc, String nombreImpresor) {

        try {
            Runtime.getRuntime().exec("lp -d " + nombreImpresor + " /opt/pedidos/" + doc);
        } catch (IOException e) {
            System.out.println("EXCEPTION: " + e.getMessage());
        }

    }

    public void imprimirTicket(String doc, String nombreImpresor) throws PrintException, IOException {

        FileInputStream inputStream = new FileInputStream("/opt/pedidos/" + doc);

        DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc document = new SimpleDoc(inputStream, docFormat, null);

        AttributeSet attributeSet = new HashAttributeSet();
        attributeSet.add(new PrinterName(nombreImpresor, null));
        attributeSet.add(ColorSupported.NOT_SUPPORTED);
        PrintService[] services = PrintServiceLookup.lookupPrintServices(docFormat, attributeSet);

        //    System.out.println("Imprimiendo en : " + services[0].getName());

        DocPrintJob printJob = services[0].createPrintJob();
        printJob.print(document, new HashPrintRequestAttributeSet());

        inputStream.close();
    }

    public int Tickec(VProcesodepedidos p, int tipoAprobado) throws JRException {
        List<VProcesodepedidos> listA = new ArrayList<>();
        listA.add(p);
        SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yy hh:mm a");

        Integer corr = vprofl.obtenerCorrelativoDespacho(tipoAprobado, p.getSucursal());
        String usuario = this.usuario.getUsuarioNombre();

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(listA);
        String reportPath = "/opt/reportesJasper/tickecNumero.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("consultorCodigoA", p.getConsultorCodigo());
        parametros.put("correlativo", corr.toString());
        parametros.put("nombreConsultor", cflo.ObtenerNombreCompleto(p.getConsultorCodigo()));
        parametros.put("fechaHora", fmt.format(new Date()));
        parametros.put("territorio", p.getTerritorio());
        parametros.put("usuarioAproba", usuario);
        parametros.put("tipoPedido", validaEstado(tipoAprobado));

        jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, beanCollectionDataSource);

        return corr;
    }

    public BprocesosCreditos() {
    }

    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 nuevoMensajeGrowl(FacesMessage.Severity severity, String summary, String detail) {
        FacesContext.getCurrentInstance().
                addMessage(null, new FacesMessage(severity, summary, detail));
    }

}
