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

import com.cosmodas.EntCosmos.*;
import com.cosmodas.FacadeCosmos.AbonoflFacadeLocal;
import com.cosmodas.FacadeCosmos.BancosFacadeLocal;
import com.cosmodas.FacadeCosmos.DatosCosultoresCompletosFacadeLocal;
import com.cosmodas.FacadeCosmos.WcUsuariosFacadeLocal;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.math.BigDecimal;
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.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import javax.imageio.stream.FileImageOutputStream;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JasperPrint;
import org.primefaces.event.CloseEvent;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.ResizeEvent;
import org.primefaces.extensions.event.ImageAreaSelectEvent;
import org.primefaces.extensions.event.RotateEvent;
import org.primefaces.model.CroppedImage;

/**
 * @author depv
 */
@Named
@ManagedBean
@ViewScoped
public class abonoBean implements Serializable {

    @EJB
    private AbonoflFacadeLocal abflfl;
    @EJB
    private DatosCosultoresCompletosFacadeLocal dccfl;
    @EJB
    private BancosFacadeLocal bfl;
    @EJB
    private WcUsuariosFacadeLocal wcufl;

    @Inject
    private Abonofl nuevoAbono;
    @Inject
    private WcUsuarios usuario;
    @Inject
    private Sucursales sucursal;
    private List<Abonofl> listaAbonos;
    @Inject
    private DatosCosultoresCompletos consultor;
    private List<DatosCosultoresCompletos> consultoresList;
    private String ConsultorCodigo;
    private CroppedImage croppeFoto;
    private String imageTemp;
    private String boletaSubir;
    private String monto;
    private String bancoCodigo;
    private List<Bancos> bancos;
    private Date fechaDePago;
    private String realPaht;
    private int estadoAbonoSelect;
    //---------------------------------------------------------------- 
    private JasperPrint jasperPrint;
    private ExternalContext exc;
    private HttpSession session;
    private Date fechaDeBoletasHistorico;
//----------------------------------------------------------------


    public Date getFechaDeBoletasHistorico() {
        return fechaDeBoletasHistorico;
    }

    public void setFechaDeBoletasHistorico(Date fechaDeBoletasHistorico) {
        this.fechaDeBoletasHistorico = fechaDeBoletasHistorico;
    }

    public int getEstadoAbonoSelect() {
        return estadoAbonoSelect;
    }

    public void setEstadoAbonoSelect(int estadoAbonoSelect) {
        this.estadoAbonoSelect = estadoAbonoSelect;
    }

    public WcUsuarios getUsuario() {
        return usuario;
    }

    public void setUsuario(WcUsuarios usuario) {
        this.usuario = usuario;
    }

    public Sucursales getSucursal() {
        return sucursal;
    }

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

    public String getBancoCodigo() {
        return bancoCodigo;
    }

    public void setBancoCodigo(String bancoCodigo) {
        this.bancoCodigo = bancoCodigo;
    }

    public Date getFechaDePago() {
        return fechaDePago;
    }

    public void setFechaDePago(Date fechaDePago) {
        this.fechaDePago = fechaDePago;
    }

    public String getMonto() {
        return monto;
    }

    public void setMonto(String monto) {
        this.monto = monto;
    }

    public List<Bancos> getBancos() {
        return bancos;
    }

    public void setBancos(List<Bancos> bancos) {
        this.bancos = bancos;
    }

    public String getBoletaSubir() {
        return boletaSubir;
    }

    public void setBoletaSubir(String boletaSubir) {
        this.boletaSubir = boletaSubir;
    }

    public Abonofl getNuevoAbono() {
        return nuevoAbono;
    }

    public void setNuevoAbono(Abonofl nuevoAbono) {
        this.nuevoAbono = nuevoAbono;
    }

    public List<Abonofl> getListaAbonos() {
        return listaAbonos;
    }

    public void setListaAbonos(List<Abonofl> listaAbonos) {
        this.listaAbonos = listaAbonos;
    }

    public DatosCosultoresCompletos getConsultor() {
        return consultor;
    }

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

    public List<DatosCosultoresCompletos> getConsultoresList() {
        return consultoresList;
    }

    public void setConsultoresList(List<DatosCosultoresCompletos> consultoresList) {
        this.consultoresList = consultoresList;
    }

    public String getConsultorCodigo() {
        return ConsultorCodigo;
    }

    public void setConsultorCodigo(String ConsultorCodigo) {
        this.ConsultorCodigo = ConsultorCodigo;
    }

    public CroppedImage getCroppeFoto() {
        return croppeFoto;
    }

    public void setCroppeFoto(CroppedImage croppeFoto) {
        this.croppeFoto = croppeFoto;
    }

    public String getImageTemp() {
        return imageTemp;
    }

    public void setImageTemp(String imageTemp) {
        this.imageTemp = imageTemp;
    }

    @PostConstruct
    private void init() {
        this.exc = FacesContext.getCurrentInstance().getExternalContext();
        this.usuario = (WcUsuarios) exc.getSessionMap().get("usuario");
        this.sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        this.consultor = new DatosCosultoresCompletos();
        this.bancos = bfl.buscarBancos();
        this.fechaDeBoletasHistorico = new Date();
        obtenerBoletasFino();

        //   this.listaAbonos = abflfl.ObtenerBoletasUsuarioIngresa(usuario.getUsuarioCodigo());

    }

    public boolean rendereCalendar() {
        return estadoAbonoSelect > 0;
    }

    public void obtenerBoletasFino() {
        listaAbonos = new ArrayList<>();

        String usuarioSuper = usuario.getUsuarioNombre();
        usuarioSuper = usuarioSuper.substring(1, 3);


        if (isNumeric(usuarioSuper)) {

            switch (estadoAbonoSelect) {
                case 0:
                    listaAbonos.addAll(abflfl.obtnerNoprocesadas(usuarioSuper, false));
                    break;
                case 1:
                    listaAbonos.addAll(abflfl.obtnerNoprocesadas(usuarioSuper, true, fechaDeBoletasHistorico));
                    break;
                case 2:
                    listaAbonos.addAll(abflfl.anuladas(usuarioSuper, fechaDeBoletasHistorico));
                    break;
                case 3:
                    listaAbonos.addAll(abflfl.todasTipo(usuarioSuper, fechaDeBoletasHistorico));
                    break;
            }

        } else {
            switch (estadoAbonoSelect) {
                case 0:
                    listaAbonos.addAll(abflfl.ObtenerBoletasUsuarioIngresa(usuario.getUsuarioCodigo(), false));
                    break;
                case 1:
                    listaAbonos.addAll(abflfl.ObtenerBoletasUsuarioIngresa(usuario.getUsuarioCodigo(), true));
                    break;
                case 2:
                    listaAbonos.addAll(abflfl.ObtenerBoletasUsuarioAnulado(usuario.getUsuarioCodigo(), true));
                    break;
                case 3:
                    break;
            }

        }

    }

    public static boolean isNumeric(String cadena) {

        boolean resultado;

        try {
            Integer.parseInt(cadena);
            resultado = true;
        } catch (NumberFormatException excepcion) {
            resultado = false;
        }

        return resultado;
    }


    public void guardarBoleta() throws IOException {

        AbonoflPK abflpk = new AbonoflPK();
        abflpk.setTipo(consultor.getTerritorioCodigo());

        Abonofl abfl = new Abonofl();
        abfl.setAbonoflPK(abflpk);
        abfl.setBanco(bancoCodigo);
        abfl.setComentarios("");
        abfl.setConsultorCodigo(consultor.getConsultorCodigo());
        abfl.setFecha(new Date());
        abfl.setFechaPago(fechaDePago);
        abfl.setMonto(new BigDecimal(monto));
        abfl.setUsuarioIngresa(usuario.getUsuarioCodigo());
        abfl.setVerificado(false);
        abflfl.GuardarBoleta(abfl);

        String inicioDir = realPaht + "/" + boletaSubir;
        String FinDir = "/opt/boletas/" + abfl.getAbonoflPK().getTipo() + abfl.getAbonoflPK().getCabono() + ".jpg";

        try {

            String cmd = "mv " + inicioDir + " " + FinDir; //Comando de apagado en windows
            System.out.println(cmd);
            Runtime.getRuntime().exec(cmd);
        } catch (IOException ioe) {
            System.out.println(ioe);
        }

        refresh();


    }

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

    }

    public String verifica(Abonofl v) {

        if (v.isAnulado()) {
            return "Anulada";
        } else {
            if (v.isAplicado()) {
                return "Aplicado";
            } else {
                return "Sin Revisar";
            }
        }
    }

    public String verificaColor(Abonofl v) {

        if (v.isAnulado()) {
            return "tomato";
        } else {
            if (v.isAplicado()) {
                return "green";
            } else {
                return "blue";
            }
        }
    }

    public DatosCosultoresCompletos aboLi(String cosd) {

        DatosCosultoresCompletos rs = dccfl.busquedaDato(cosd);

        return rs;
    }

    public void actionFoto() {
        this.croppeFoto = null;
        this.imageTemp = null;
    }

    public void actionClose() {
        System.out.println("boleta nombre: " + boletaSubir);
        FacesContext.getCurrentInstance().addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Boleta En sistema", "la imagen ha sido cargada"));
    }

    public void actionGuardarFoto() {
        boletaSubir = consultor.getConsultorCodigo() + ".jpg";
        String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/boletas/");
        realPaht = path;
        String archivo = path + File.separator + boletaSubir;
        // boletaSubir = imageTemp;
        System.out.println(path + " salidas");
        try {

            if (croppeFoto != null) {
                FileImageOutputStream imageOutput = new FileImageOutputStream(new File(archivo));
                imageOutput.write(croppeFoto.getBytes(), 0, croppeFoto.getBytes().length);
                imageOutput.close();
            } else {
                OutputStream outStream = new FileOutputStream(new File(archivo));
                InputStream inputStream = new FileInputStream(path + "/temp/" + this.getImageTemp());
                byte[] buffer = new byte[6124];
                int bulk;
                while (true) {
                    bulk = inputStream.read(buffer);
                    if (bulk < 0) {
                        break;
                    }
                    outStream.write(buffer, 0, bulk);
                    outStream.flush();
                }
                outStream.close();
                inputStream.close();
            }

            actionFoto();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void anulaBoleta(Abonofl a) {

        abflfl.remove(a);
        obtenerBoletasFino();
        FacesContext.getCurrentInstance().addMessage("", new FacesMessage(FacesMessage.SEVERITY_INFO, "Eliminados", "Boleta Eliminada"));

    }

    public void uploadFile(FileUploadEvent event) {
        try {

            ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                    .getExternalContext().getContext();
            String realPath = ctx.getRealPath("/");
            String path = realPath + "boletas/temp/";

            File f = new File(path);

            if (f.mkdirs()) {
                System.out.println("Directory is created");
            } else {
                System.out.println("Directory cannot be created");
            }

            String archivo = path + File.separator + event.getFile().getFileName();

            FileOutputStream fileOutputStream = new FileOutputStream(archivo);
            byte[] buffer = new byte[6124];
            int bulk;
            InputStream inputStream = event.getFile().getInputstream();
            while (true) {
                bulk = inputStream.read(buffer);
                if (bulk < 0) {
                    break;
                }
                fileOutputStream.write(buffer, 0, bulk);
                fileOutputStream.flush();
            }
            fileOutputStream.close();
            inputStream.close();

            this.setImageTemp(event.getFile().getFileName());

        } catch (IOException e) {
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Error al subir el archivo"));
        }
    }

    public void cosultarConsultor() {

        if (ConsultorCodigo.length() == 6) {
            consultor = dccfl.busquedaDato(ConsultorCodigo);
        }

    }

    //setter and getter
    public abonoBean() {
    }

}
