package com.rrhh.marcaciones;

import com.contabilidad.EntConta.*;
import com.contabilidad.FacadeConta.DepartamentosFacadeLocal;
import com.contabilidad.FacadeConta.HorasAnticipoFacadeLocal;
import com.contabilidad.FacadeConta.PersonalFacadeLocal;
import com.cosmodas.EntCosmos.Sucursales;
import com.cosmodas.EntCosmos.WcUsuarios;
import com.cosmodas.FacadeCosmos.SucursalesFacadeLocal;
import com.cosmodas.validaciones.NumeroALetras;
import com.cosmodas.validaciones.obternerMes;
import com.utilitarios.ConversorArchivosSO;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.apache.commons.io.FileUtils;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
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.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.*;

@ManagedBean
@ViewScoped
public class bmarcaciones implements Serializable {

    //LISTAS
    private List<MarcacionesFace> marcaciones;
    private List<Departamentos> depart;
    private Personal empleadoSelect;
    private List<Personal> listaEmpeleados;
    private JasperPrint jasperPrint;
    //VARIABLES
    private Personal empleado;
    private String sucursalCodigo;
    private String Departamento;
    private Sucursales sucursal;
    private ExternalContext exc;
    private HttpSession session;
    private Date fechaIni;
    private Date fechaFin;
    @Inject
    private WcUsuarios usuario;
    private String archiNuevoPdf;
    private String idPdf;
    private List<PersonalAsignado> personalAsignado;

    private boolean rederedAdminAndConta;

    //EJB personal
    @EJB
    private PersonalFacadeLocal pfl;
    @EJB
    private DepartamentosFacadeLocal dpf;
    @EJB
    private SucursalesFacadeLocal sfl;
    @EJB
    HorasAnticipoFacadeLocal hafl;

    public List<MarcacionesFace> getMarcaciones() {
        return marcaciones;
    }

    public void setMarcaciones(List<MarcacionesFace> marcaciones) {
        this.marcaciones = marcaciones;
    }

    public List<Departamentos> getDepart() {
        return depart;
    }

    public void setDepart(List<Departamentos> depart) {
        this.depart = depart;
    }

    public List<Personal> getListaEmpeleados() {
        return listaEmpeleados;
    }

    public void setListaEmpeleados(List<Personal> listaEmpeleados) {
        this.listaEmpeleados = listaEmpeleados;
    }


    public Personal getEmpleado() {
        return empleado;
    }

    public void setEmpleado(Personal empleado) {
        this.empleado = empleado;
    }

    public String getSucursalCodigo() {
        return sucursalCodigo;
    }

    public void setSucursalCodigo(String sucursalCodigo) {
        this.sucursalCodigo = sucursalCodigo;
    }

    public String getDepartamento() {
        return Departamento;
    }

    public void setDepartamento(String departamento) {
        Departamento = departamento;
    }

    public Sucursales getSucursal() {
        return sucursal;
    }

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

    public Date getFechaIni() {
        return fechaIni;
    }

    public void setFechaIni(Date fechaIni) {
        this.fechaIni = fechaIni;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public String getArchiNuevoPdf() {
        return archiNuevoPdf;
    }

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

    public boolean isRederedAdminAndConta() {
        return rederedAdminAndConta;
    }

    public void setRederedAdminAndConta(boolean rederedAdminAndConta) {
        this.rederedAdminAndConta = rederedAdminAndConta;
    }

    public List<PersonalAsignado> getPersonalAsignado() {
        return personalAsignado;
    }

    public void setPersonalAsignado(List<PersonalAsignado> personalAsignado) {
        this.personalAsignado = personalAsignado;
    }

    public Personal getEmpleadoSelect() {
        return empleadoSelect;
    }

    public void setEmpleadoSelect(Personal empleadoSelect) {
        this.empleadoSelect = empleadoSelect;
        marcaciones = new ArrayList<>();
    }

    public String obtenerdepartamento(String dep) {
        String rs = "";

        try {
            rs = dpf.find(dep).getNombreDepartamento();
        } catch (Exception e) {

        }

        return rs;
    }
    public String obtenerNombreSucursal(String sucursalCodigo) {


        String rs = "NOHAY";
        try {

            rs = sfl.find(sucursalCodigo).getSalaNombreCorto();
        } catch (Exception e) {

        }
        return rs;

    }

    @PostConstruct
    public void init() {

       // this.listaEmpeleados = pfl.empleadosActivos();
        this.idPdf = "none";
        this.listaEmpeleados = new ArrayList<>();
        this.marcaciones = new ArrayList<>();
        ConversorArchivosSO co = new ConversorArchivosSO();
        this.depart = dpf.findAll();
        this.empleado = new Personal();
        this.session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        exc = FacesContext.getCurrentInstance().getExternalContext();
        sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        usuario = (WcUsuarios) exc.getSessionMap().get("usuario");

        this.personalAsignado = hafl.obtenerPersonalAsignado(usuario.getUsuarioCodigo());


        switch (usuario.getGrupoUsuario().getIdGruposUsuarios()) {
            case 1:
                rederedAdminAndConta = true;
                listaEmpeleados = pfl.empleadosActivos();
                break;
            case 5:
                rederedAdminAndConta = true;
                listaEmpeleados = pfl.empleadosActivos();
                break;
            default:
                rederedAdminAndConta = false;
                for (PersonalAsignado p : personalAsignado) {
                    this.listaEmpeleados.add(pfl.empleadoPorCodigo(p.getEmpleadoCodigo()));
                }
                break;
        }

    }

    public void  obtenerHoras(){

       List<MarcacionesFace> lstmar =  new ArrayList<>();
        Calendar inCal = Calendar.getInstance();
        inCal.setTime(fechaIni);
        Calendar outCal = Calendar.getInstance();
        outCal.setTime(fechaFin);

        Integer diaIncal = inCal.get(Calendar.DAY_OF_MONTH);
        Integer diaOutCal = outCal.get(Calendar.DAY_OF_MONTH);

        do{

            lstmar.add(pfl.marcacionesEmpleado(empleadoSelect.getCodigoEmpleado(),inCal.getTime()));
            diaIncal = diaIncal +1;

            inCal.add(Calendar.DAY_OF_MONTH, 1);


        }while (diaIncal<=diaOutCal);


        marcaciones =  lstmar;
    }

    public void openPDFHORAS() throws IOException, JRException {

        obtenerHoras();
        CreaPDF(marcaciones, empleadoSelect);
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
                .getExternalContext().getContext();
        String realPath = ctx.getRealPath("/");

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

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

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

    public void CreaPDF(List<MarcacionesFace> m, Personal emp) throws JRException, IOException {

        fillMarcacion(m, emp);
        idPdf = m.get(0).getId();
        JasperExportManager.exportReportToPdfFile(jasperPrint, "/opt/tarjetas_marcaciones/" + idPdf + ".pdf");
        HttpServletResponse httpServletResponse
                = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    }

    public void fillMarcacion(List<MarcacionesFace> m, Personal emp) throws JRException {

        NumeroALetras nu = new NumeroALetras();
        obternerMes om = new obternerMes();

        JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(m);
        String reportPath = "/opt/reportesJasper/reporteMarcacion.jrxml";
        JasperReport jasperReport = JasperCompileManager.compileReport(reportPath);
        Map parametros = new HashMap();
        parametros.put("nombreEmpleado", emp.getNombreEmpleado() + " "+emp.getApellidoEmpleado());
        parametros.put("fechaIni", fechaIni);
        parametros.put("fechaFin", fechaFin);
        parametros.put("codigoEmpleado", emp.getCodigoEmpleado());
        parametros.put("sala", dpf.find(emp.getDepartamento()).getNombreDepartamento());

        //--------------------------------------------------------------------------------------------------

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

    public bmarcaciones() {
    }
}
