/*
 * 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.EntCosmos.*;
import com.cosmodas.FacadeCosmos.*;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
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.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.apache.commons.io.FileUtils;

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

    @EJB
    VprecioProgramaFFacadeLocal vppffl;
    @EJB
    DatosCosultoresCompletosFacadeLocal dccfl;
    @EJB
    RutaRepartoFacadeLocal rrfl;
    @EJB
    PedidosFacadeLocal pedfl;
    @EJB
    DetallePedidosFacadeLocal depedfl;
    @EJB
    ProcesoDePedidosFacadeLocal propeddfl;
    @EJB
    TerritoriosFacadeLocal terfl;
    @EJB
    VProcesodepedidosFacadeLocal vprofl;
    @EJB
    ConsultoresFacadeLocal cflo;
    @EJB
    SucursalesFacadeLocal daoSucursalLo;
    @EJB
    ProductosFacadeLocal proFl;
    @EJB
    OfertasFacadeLocal ofFl;
    @EJB
    WcUsuariosFacadeLocal ufl;
    @EJB
    GeneralesFacadeLocal generalesDao;
    @EJB
    ConsultoresDatosRepartoDaoLocal cdrdl;

    private List<VProcesodepedidos> pedidosDespacho;
    private String archiNuevoPdf;
    private Consultores consultorSelect;
    private VProcesodepedidos despachoPreparcionSele;
    private JasperPrint jasperPrint;
    private String alarmaPedidos;
    private Sucursales sucursalSelect;

    private VProcesodepedidos pedidoSel;
    private Boolean reparto;
    private String[] selectTerritorio;
    private Boolean despacho;
    private DatosCosultoresCompletos consultorCodigoSelect;
    private List<Territorios> territorios;
    private ExternalContext exc;
    private String saldosCosultor;
    private HttpSession session;

    @Inject
    private WcUsuarios user;
    @Inject
    private Sucursales sucursal;
    private List<Sucursales> listaSucursales;

    public List<Sucursales> getListaSucursales() {
        return listaSucursales;
    }

    public void setListaSucursales(List<Sucursales> listaSucursales) {
        this.listaSucursales = listaSucursales;
    }


    public Sucursales getSucursalSelect() {
        return sucursalSelect;
    }

    public void setSucursalSelect(Sucursales sucursalSelect) {
        this.sucursalSelect = sucursalSelect;
    }

    public String getSaldosCosultor() {
        return saldosCosultor;
    }

    public void setSaldosCosultor(String saldosCosultor) {
        this.saldosCosultor = saldosCosultor;
    }

    public Sucursales getSucursal() {
        return sucursal;
    }

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

    public List<VProcesodepedidos> getPedidosDespacho() {
        return pedidosDespacho;
    }

    public void setPedidosDespacho(List<VProcesodepedidos> pedidosDespacho) {
        this.pedidosDespacho = pedidosDespacho;
    }

    public String getArchiNuevoPdf() {
        return archiNuevoPdf;
    }

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

    public Consultores getConsultorSelect() {
        return consultorSelect;
    }

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

    public VProcesodepedidos getDespachoPreparcionSele() {
        return despachoPreparcionSele;
    }

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

    public JasperPrint getJasperPrint() {
        return jasperPrint;
    }

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

    public String getAlarmaPedidos() {
        return alarmaPedidos();
    }

    public void setAlarmaPedidos(String alarmaPedidos) {
        this.alarmaPedidos = alarmaPedidos;
    }

    public VProcesodepedidos getPedidoSel() {
        return pedidoSel;
    }

    public void setPedidoSel(VProcesodepedidos pedidoSel) {
        this.pedidoSel = pedidoSel;
    }

    public Boolean getReparto() {
        return reparto;
    }

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

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

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

    public Boolean getDespacho() {
        return despacho;
    }

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

    public DatosCosultoresCompletos getConsultorCodigoSelect() {
        return consultorCodigoSelect;
    }

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

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

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

    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 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 String validatipoReparto(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;
    }

    public void obtenerPedidos() {
        exc = FacesContext.getCurrentInstance().getExternalContext();
        this.sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        this.pedidosDespacho = 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.ObtenerProcesoPedidosDes(selectTerritorio[i], 1, sucCod));
                } catch (Exception e) {
                }

            }

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

            }

        }

        if (!pedidos.isEmpty()) {

            Collections.sort(pedidos, new Comparator<VProcesodepedidos>() {
                @Override
                public int compare(VProcesodepedidos p1, VProcesodepedidos p2) {
                    return new Integer(p1.getNumeracionDiaria()).compareTo(new Integer(p2.getNumeracionDiaria()));
                }

            });

            pedidosDespacho = pedidos;
        }

    }

    public void actualizaPedidos(){

        obtenerPedidos();
    }


    @PostConstruct
    public void init() {

        //this.listKardex = new ArrayList<>();
        territorios = terfl.findAll();
        this.pedidosDespacho = new ArrayList();
        this.pedidoSel = new VProcesodepedidos();
        this.consultorCodigoSelect = new DatosCosultoresCompletos();
        this.consultorSelect = new Consultores();
        this.despacho = false;
        this.reparto = false;
        selectTerritorio = new String[territorios.size()];
        listaSucursales = daoSucursalLo.findAll();
        int listater = 0;

        for (Territorios tr : territorios) {

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

            listater++;
        }

    }

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

    public void cambiarSucursal(VProcesodepedidos p, Sucursales s){




    }

    public String validaEstado(int input) {

        String rs = "No Revisado";

        switch (input) {

            case 0:
                rs = "NO REVISADO";
                break;
            case 1:
                rs = "CREDITO";
                break;
            case 2:
                rs = "CONTADO";
                break;
            case 3:
                rs = "DENEGADO";
                break;
            case 4:
                rs = "SOYAPANGO";
                break;
            default:
                break;

        }

        return rs;
    }

    public String alarmaPedidos() {
        String ruta = null;
        try {
            for (VProcesodepedidos p : getPedidosDespacho()) {

                if (!p.getInicioFacturacionB()) {
                    ruta = "./../sonidos/alarma.mp3";
                }

            }

        } catch (Exception e) {
        }

        return ruta;
    }

    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 pedidoNoLeido(boolean pedidosColor) {

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

    }

    public String busquedaUsuario(String codigoUsuario) {

        return ufl.find(codigoUsuario).getNombreEmpleado();
    }

    public void fillReportSalas(VProcesodepedidos p) throws JRException {

        DatosCosultoresCompletos cliente = dccfl.busquedaDato(p.getConsultorCodigo());

        List<CuerpoPedido> dcp = new ArrayList<>();

        ConsultoresDatosReparto cosd = cdrdl.obtenerDatoReparto(p.getConsultorCodigo());

        SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yy hh:mm a");

        List<DetallePedidos> detp = new ArrayList<>();

        detp = depedfl.ObtenerDetallePedido(p.getTerritorio(), p.getNumeroPedido());

        for (DetallePedidos cp : detp) {

            CuerpoPedido dpp = new CuerpoPedido();

            dpp.setCantidad(cp.getCantidad());
            dpp.setProductoCodigo(cp.getDetallePedidosPK().getProductoCodigo());
            dpp.setProductoPrecioConDescuento(cp.getConDescuento().doubleValue());
            dpp.setProductoPrecioSinDescuento(cp.getSinDescuentto().doubleValue());
            dpp.setProdutoOferta(ofFl.find(cp.getDetallePedidosPK().getOfertaDetallePedido()).getOfertaDescripcion());
            dpp.setProductoNombre(proFl.find(cp.getDetallePedidosPK().getProductoCodigo()).getProductoNombre());
            dcp.add(dpp);
        }

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(dcp);
        String reportPath = "/opt/reportesJasper/pedidoReparto.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("totalConDescuesto", p.getFacturaTotalConDescuento().toString());
        parametros.put("totalSinDescuesto", p.getFacturaTotalSinDescuento().toString());
        parametros.put("consultor_nombre", cflo.ObtenerNombreCompleto(p.getConsultorCodigo()));
        parametros.put("consultor_codigo", p.getConsultorCodigo());
        parametros.put("telefonoConsultor", cosd.getTelefonoContacto());
        parametros.put("territorio", p.getTerritorio());
        parametros.put("programaCod", p.getProgramaCodigo());
        parametros.put("observaciones", p.getObservaciones());
        parametros.put("usuarioCredito", ufl.find(p.getUsuarioApruebaPed()).getNombreEmpleado());
        parametros.put("fechaAprovado", fmt.format(p.getTiempoAprobado()));
        parametros.put("numeroPedidoCorr", p.getTerritorio() + p.getNumeroPedido());

        switch (p.getTipoReparto()) {
            case 0:
                parametros.put("repartoUbicacion", "ENTREGAR EN OFICINA");
                break;
            case 1:
                parametros.put("repartoUbicacion", "LLEVARA SUPERVISORA");
                break;
            case 2:
                parametros.put("repartoUbicacion", "CAEX: " + cosd.getDireccionReparto());
                break;
            case 3:
                parametros.put("repartoUbicacion", "PUNTO DE APOYO O RUTA: " + rrfl.busquedaRuta(p.getPedidoCorrelativoReparto()).getDireccion());
                break;
            case 4:
                parametros.put("repartoUbicacion", "CASA POR CASA: " + cosd.getDireccionReparto());
                break;
        }
        parametros.put("saldoAnterior", cliente.getCargoPendiente().toString());

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

    public void fillReport(VProcesodepedidos p) throws JRException {

        DatosCosultoresCompletos cliente = dccfl.busquedaDato(p.getConsultorCodigo());
        List<CuerpoPedido> dcp = new ArrayList<>();
        SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yy hh:mm a");
        ConsultoresDatosReparto cosd = cdrdl.obtenerDatoReparto(p.getConsultorCodigo());

        List<DetallePedidos> detp = new ArrayList<>();

        detp = depedfl.ObtenerDetallePedido(p.getTerritorio(), p.getNumeroPedido());

        for (DetallePedidos cp : detp) {

            CuerpoPedido dpp = new CuerpoPedido();

            dpp.setCantidad(cp.getCantidad());
            dpp.setProductoCodigo(cp.getDetallePedidosPK().getProductoCodigo());
            dpp.setProductoPrecioConDescuento(cp.getConDescuento().doubleValue());
            dpp.setProductoPrecioSinDescuento(cp.getSinDescuentto().doubleValue());
            dpp.setProdutoOferta(ofFl.find(cp.getDetallePedidosPK().getOfertaDetallePedido()).getOfertaDescripcion());
            dpp.setProductoNombre(proFl.find(cp.getDetallePedidosPK().getProductoCodigo()).getProductoNombre());
            dcp.add(dpp);
        }

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(dcp);
        //String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reportes/etiquetas.jrxml");
        //JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);

        String reportPath = "/opt/reportesJasper/pedidoDespacho.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("totalConDescuesto", p.getFacturaTotalConDescuento().toString());
        parametros.put("totalSinDescuesto", p.getFacturaTotalSinDescuento().toString());
        parametros.put("consultor_nombre", cflo.ObtenerNombreCompleto(p.getConsultorCodigo()));
        parametros.put("telefonoConsultor", cosd.getTelefonoContacto());
        parametros.put("consultor_codigo", p.getConsultorCodigo());
        parametros.put("territorio", p.getTerritorio());
        parametros.put("programaCod", p.getProgramaCodigo());
        parametros.put("saldoAnterior", cliente.getCargoPendiente().toString());
        if (!p.getObservaciones().isEmpty()) {
            if (entregaPedidos(p.getFechaHoraRetira()).equalsIgnoreCase("POSFECHADO")) {
                parametros.put("observaciones", p.getObservaciones() + " DESPACHAR " + fmt.format(p.getFechaHoraRetira()));
            } else {
                parametros.put("observaciones", p.getObservaciones());
            }
            parametros.put("observaciones", p.getObservaciones());
        } else {
            if (entregaPedidos(p.getFechaHoraRetira()).equalsIgnoreCase("POSFECHADO")) {
                parametros.put("observaciones", " DESPACHAR " + fmt.format(p.getFechaHoraRetira()));
            } else {
                parametros.put("observaciones", "---");
            }

        }

        parametros.put("tipoPedido", validaEstado(p.getAprobado()));
        parametros.put("fechaAprovado", fmt.format(p.getTiempoAprobado()));
        parametros.put("usuarioCredito", ufl.find(p.getUsuarioApruebaPed()).getNombreEmpleado());
        parametros.put("numeroPedidoCorr", p.getTerritorio() + p.getNumeroPedido());
        parametros.put("noped", p.getNumeracionDiaria().toString());

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

    public void openPDF(VProcesodepedidos p) throws IOException, JRException {

        if (!p.getInicioFacturacionB()) {
            vprofl.actualizaImpreso(p);
        }

        CreaPDF(p);

        System.out.println(p.getConsultorCodigo());
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                .getExternalContext().getContext();
        String realPath = ctx.getRealPath("/");

        System.out.println("direccion = " + realPath);

        File source = new File("/opt/pedidos/" + p.getId() + ".pdf");
        File dest = new File(realPath + "/apps/pdf/" + p.getId() + ".pdf");
        archiNuevoPdf = "./pdf/" + p.getId() + ".pdf";
        FileUtils.copyFile(source, dest, false);

        //ppfl.editaImpresion(p.getIdpp());
    }

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

    }

    public void CreaPDF(VProcesodepedidos p) throws JRException, IOException {

        if (p.getPedidoReparto()) {
            fillReportSalas(p);
        } else {
            fillReport(p);
        }

        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/pedidos/" + p.getId() + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    }

    public BprocesoPedidosDespacho() {
    }

}
