package com.rrhh.horasextras;

import com.contabilidad.EntConta.*;
import com.contabilidad.FacadeConta.*;
import com.cosmodas.EntCosmos.Sucursales;
import com.cosmodas.EntCosmos.WcUsuarios;
import net.sf.jasperreports.engine.JasperPrint;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
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 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.HttpServletResponse;
import javax.servlet.http.HttpSession;

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


@Named
@ViewScoped
public class bhorasextras implements Serializable {

    private List<VEmpleadosFijos> empleados;
    private List<HorasAnticipo> horasExtras;

    private List<PersonalAsignado> personalAsignado;
    private List<HorasExtrasPersonal> horasExtrasEmpleados;
    private String archiNuevoPdf;
    private Integer turnosPagar;
    private boolean rederedAdminAndConta;

    private Double horasDescuento;
    private Double anticiposDirenos;
    private Integer mesElegido;


    private ExternalContext exc;
    private JasperPrint jasperPrint;
    private HttpSession session;
    private boolean quincena;

    private Date fechaHoraInicio, fechaHorafin;

    private Date fechaInicioCon, fechaFinCon;
    @Inject
    private HorasExtrasPersonal horaNueva;

    @Inject
    private HorasAnticipo horaExtraSerlect;
    @Inject
    private VEmpleadosFijos empleado;
    @Inject
    private HorasExtrasPersonal horaNuevaTemp;
    @Inject
    private Sucursales sucursal;
    @Inject
    private WcUsuarios usuario;

    private String observaciones;

    @EJB
    VEmpleadoseventualesFacadeLocal veefl;
    @EJB
    HorasAnticipoFacadeLocal hafl;
    @EJB
    HorasDeTrabajoTemporalFacadeLocal hdttfl;

    public boolean getQuincena() {
        return quincena;
    }

    public void setQuincena(boolean quincena) {
        this.quincena = quincena;
    }

    public boolean isRederedAdminAndConta() {
        return rederedAdminAndConta;
    }

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

    public Double getAnticiposDirenos() {
        return anticiposDirenos;
    }

    public void setAnticiposDirenos(Double anticiposDirenos) {
        this.anticiposDirenos = anticiposDirenos;
    }

    public Double getHorasDescuento() {
        return horasDescuento;
    }

    public void setHorasDescuento(Double horasDescuento) {
        this.horasDescuento = horasDescuento;
    }

    public Date getFechaInicioCon() {
        return fechaInicioCon;
    }

    public void setFechaInicioCon(Date fechaInicioCon) {
        this.fechaInicioCon = fechaInicioCon;
    }

    public Date getFechaFinCon() {
        return fechaFinCon;
    }

    public void setFechaFinCon(Date fechaFinCon) {
        this.fechaFinCon = fechaFinCon;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public List<VEmpleadosFijos> getEmpleados() {
        return empleados;
    }

    public void setEmpleados(List<VEmpleadosFijos> empleados) {
        this.empleados = empleados;
    }

    public List<HorasAnticipo> getHorasExtras() {
        return horasExtras;
    }

    public void setHorasExtras(List<HorasAnticipo> horasExtras) {
        this.horasExtras = horasExtras;
    }

    public String getArchiNuevoPdf() {
        return archiNuevoPdf;
    }

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

    public Integer getTurnosPagar() {
        return turnosPagar;
    }

    public void setTurnosPagar(Integer turnosPagar) {
        this.turnosPagar = turnosPagar;
    }

    public ExternalContext getExc() {
        return exc;
    }

    public void setExc(ExternalContext exc) {
        this.exc = exc;
    }

    public JasperPrint getJasperPrint() {
        return jasperPrint;
    }

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

    public HttpSession getSession() {
        return session;
    }

    public void setSession(HttpSession session) {
        this.session = session;
    }

    public Date getFechaHoraInicio() {
        return fechaHoraInicio;
    }

    public void setFechaHoraInicio(Date fechaHoraInicio) {
        this.fechaHoraInicio = fechaHoraInicio;
    }

    public Date getFechaHorafin() {
        return fechaHorafin;
    }

    public void setFechaHorafin(Date fechaHorafin) {
        this.fechaHorafin = fechaHorafin;
    }

    public HorasExtrasPersonal getHoraNueva() {
        return horaNueva;
    }

    public void setHoraNueva(HorasExtrasPersonal horaNueva) {
        this.horaNueva = horaNueva;
    }

    public VEmpleadosFijos getEmpleado() {
        return empleado;
    }

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

    public HorasExtrasPersonal getHoraNuevaTemp() {
        return horaNuevaTemp;
    }

    public void setHoraNuevaTemp(HorasExtrasPersonal horaNuevaTemp) {
        this.horaNuevaTemp = horaNuevaTemp;
    }

    public Sucursales getSucursal() {
        return sucursal;
    }

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

    public HorasAnticipoFacadeLocal getHafl() {
        return hafl;
    }

    public void setHafl(HorasAnticipoFacadeLocal hafl) {
        this.hafl = hafl;
    }

    public List<HorasExtrasPersonal> getHorasExtrasEmpleados() {
        return horasExtrasEmpleados;
    }

    public void setHorasExtrasEmpleados(List<HorasExtrasPersonal> horasExtrasEmpleados) {
        this.horasExtrasEmpleados = horasExtrasEmpleados;
    }

    public HorasAnticipo getHoraExtraSerlect() {
        return horaExtraSerlect;
    }

    public void setHoraExtraSerlect(HorasAnticipo horaExtraSerlect) {
        this.horaExtraSerlect = horaExtraSerlect;
    }

    public Integer getMesElegido() {
        return mesElegido;
    }

    public void setMesElegido(Integer mesElegido) {
        this.mesElegido = mesElegido;
    }

    @PostConstruct
    public void init() {

        this.turnosPagar = 0;
        this.session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        exc = FacesContext.getCurrentInstance().getExternalContext();
        sucursal = (Sucursales) exc.getSessionMap().get("sucursal");
        usuario = (WcUsuarios) exc.getSessionMap().get("usuario");
        mesElegido = (new Date()).getMonth() + 1;

        this.horasDescuento = 0.00;
        this.anticiposDirenos = 0.00;
        this.personalAsignado = hafl.obtenerPersonalAsignado(usuario.getUsuarioCodigo());

        this.empleados = new ArrayList<>();


       this.quincena =  (new Date()).getDay() > 15;



        horasExtrasEmpleados = new ArrayList<>();
        obtenerHorasDelMes(mesElegido, quincena);

        switch (usuario.getGrupoUsuario().getIdGruposUsuarios()) {
            case 1:
                rederedAdminAndConta = true;
                empleados = hafl.buscarFijos();
                break;
            case 5:
                rederedAdminAndConta = true;
                empleados = hafl.buscarFijos();
                break;
            default:
                rederedAdminAndConta = false;
                for (PersonalAsignado p : personalAsignado) {
                    this.empleados.add(hafl.buscarEmpleado(p.getEmpleadoCodigo()));
                }
                break;
        }

    }

    public void actualizaList(VEmpleadosFijos e) {

        this.horasExtrasEmpleados = hafl.obtnerHorasExEm(e.getCodigoEmpleado());
    }

    public void obtenerHorasDelMes(int mes, boolean quin) {

        horasExtras = hafl.obtenerSegunMes(mes,quin);

    }


    public void borrarHora(String h) {
        hafl.borrarHoraExtra(h);
        this.horasExtrasEmpleados = hafl.obtnerHorasExEm(empleado.getCodigoEmpleado());
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Exito", "Eliminado Exitosamente"));
    }

    public void borrarHoraPago(String h) {
        hafl.borrarIngresoHoraAnticipo(h);
        horasExtras = hafl.obtenerSegunMes(mesElegido, quincena);
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Exito", "Eliminado Exitosamente"));
    }

    public void agregarHora() {
        hafl.ingresarHoraExtra(empleado.getCodigoEmpleado(), fechaHoraInicio, fechaHorafin, getObservaciones());
        this.horasExtrasEmpleados = hafl.obtnerHorasExEm(empleado.getCodigoEmpleado());

        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Exito", "Hora Agregada Exitosamente"));

    }

    public VEmpleadosFijos obtenerNombreEmpleado(String codigoEmpleado) {

        VEmpleadosFijos rs = new VEmpleadosFijos();

        rs = hafl.buscarEmpleado(codigoEmpleado);


        return rs;
    }

    public BigDecimal totalHoras(BigDecimal valor, BigDecimal horas) {

        BigDecimal rsBD = new BigDecimal(valor.doubleValue() * horas.doubleValue());
        BigDecimal rsBDS = rsBD.setScale(2, rsBD.ROUND_HALF_UP);


        return rsBDS;
    }


    public void calculoHorasNuevo(VEmpleadosFijos e) {


        Date fecha = new Date();
        PagoTemporales pag = new PagoTemporales();
        PagoTemporalesPK pagPK = new PagoTemporalesPK();
        HorasAnticipo inputs = new HorasAnticipo();

        VCalculohorassumas calHoras = hdttfl.obtnerHorasCalEx(e.getCodigoEmpleado()).get(0);

        try {
            String horasD[] = calHoras.getHorasDiurnas().split(":");
            String horasN[] = calHoras.getHorasNocturnas().split(":");
            String horasT[] = calHoras.getTotalHoras().split(":");

            Integer horasDiurnas = Integer.parseInt(horasD[0]);
            Integer minutosDiurnos = Integer.parseInt(horasD[1]);

            Integer horasNocturnas = Integer.parseInt(horasN[0]);
            Integer minutosNocturnos = Integer.parseInt(horasN[1]);

            Integer horasTotal = Integer.parseInt(horasT[0]);

            Integer horasAdicionalesDiurnos = horasDiurnas % 8;

            Double pagoPorHora = e.getHoraPago().doubleValue();
            Double pagoPorHoraNocturna = e.getHoraExtraNocturna().doubleValue();

            Double pagoDiurnos = horasDiurnas * pagoPorHora;
            Double pagoDiurnosMinutos = minutosDiurnos * pagoPorHora / 60;
            Double pagoDiurnoTotal = pagoDiurnos + pagoDiurnosMinutos;
            Double pagoNocturnos = horasNocturnas * pagoPorHoraNocturna;
            Double pagoNocturnosMinutos = minutosNocturnos * pagoPorHoraNocturna / 60;
            Double pagoNocturnosTotal = pagoNocturnos + pagoNocturnosMinutos;
            Double subtotalPago = pagoDiurnoTotal + pagoNocturnosTotal;

            BigDecimal totalHorasDiurnasDecimal = new BigDecimal(Double.parseDouble(horasD[0]) + (Double.parseDouble(horasD[1]) / 60));

            BigDecimal totalHorasNocturasDecimal = new BigDecimal(Double.parseDouble(horasN[0]) + (Double.parseDouble(horasN[1]) / 60));

            BigDecimal pagoDiurnoBD = new BigDecimal(pagoDiurnoTotal.toString());
            BigDecimal pagoDiurnoBDS = pagoDiurnoBD.setScale(2, pagoDiurnoBD.ROUND_HALF_UP);

            BigDecimal pagoDiurnosMinutosBD = new BigDecimal(pagoDiurnosMinutos.toString());
            BigDecimal pagoDiurnosMinutosBDS = pagoDiurnosMinutosBD.setScale(2, pagoDiurnosMinutosBD.ROUND_HALF_UP);

            BigDecimal pagoNocturnosBD = new BigDecimal(pagoNocturnosTotal.toString());
            BigDecimal pagoNocturnosBDS = pagoNocturnosBD.setScale(2, pagoNocturnosBD.ROUND_HALF_UP);

            BigDecimal subtotalBD = new BigDecimal(subtotalPago.toString());
            BigDecimal subtotalBDS = subtotalBD.setScale(2, subtotalBD.ROUND_HALF_UP);


            Double totalAPagar = subtotalBDS.doubleValue();

            BigDecimal totalPagoBD = new BigDecimal(totalAPagar.toString());
            BigDecimal totalPagoBDS = totalPagoBD.setScale(2, totalPagoBD.ROUND_HALF_UP);


            FacesContext context = FacesContext.getCurrentInstance();


            inputs.setFecha(new Date());
            inputs.setCodigoEmpleado(e.getCodigoEmpleado());
            inputs.setHorasDiurnas(totalHorasDiurnasDecimal);
            inputs.setHorasNocturnas(totalHorasNocturasDecimal);
            inputs.setAnticipo(new BigDecimal(anticiposDirenos));
            inputs.setDiasDescuento(new BigDecimal(horasDescuento));
            inputs.setTurnos(new BigDecimal(0.00));
            inputs.setFecha(new Date());
            inputs.setFechaxtra(new Date());


            hafl.create(inputs);
            obtenerHorasDelMes(mesElegido, quincena);

            context.addMessage(null, new FacesMessage("Exito", "Ingresado Exitosamente"));
        } catch (Exception ex) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("ERROR", "No Ingresado"));
            System.out.println(ex.toString());

            if (anticiposDirenos > 0.01 && horasDescuento > 0) {
                inputs.setFecha(new Date());
                inputs.setCodigoEmpleado(e.getCodigoEmpleado());
                inputs.setHorasDiurnas(new BigDecimal(0.00));
                inputs.setHorasNocturnas(new BigDecimal(0.00));
                inputs.setAnticipo(new BigDecimal(anticiposDirenos));
                inputs.setDiasDescuento(new BigDecimal(horasDescuento));
                inputs.setTurnos(new BigDecimal(0.00));
                inputs.setFecha(new Date());
                inputs.setFechaxtra(new Date());


                hafl.create(inputs);
                obtenerHorasDelMes(mesElegido, quincena);
            }

        }

        // this.listPagoEventuales = vpefl.obtnerHorasCal(new Date(), sucursal.getSucursalCodigo());

    }

    public void agregarHora2() {

        System.out.println("si realiza llamada");

    }

    public bhorasextras() {
    }
}
