/*
 * ESTE COMPONENTE SE ENCUENTRA PROTEGIDO POR LAS LEYES DE DERECHOS DE AUTOR.
 * @author Carlos Godoy
 * 2016
 */
package sv.com.fm.web.ui.recursohumano;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.lang.StringUtils;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.ForwardEvent;
import org.zkoss.zk.ui.event.InputEvent;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Window;
import sv.com.fm.business.dto.GenericResponse;
import sv.com.fm.business.ejb.GestorPersonalBeanLocal;
import sv.com.fm.business.ejb.UsuarioBeanLocal;
import sv.com.fm.business.entity.Planilla;
import sv.com.fm.business.entity.PlanillaDetalle;
import sv.com.fm.business.exception.FmWebException;
import sv.com.fm.business.exception.ServiceLocatorException;
import sv.com.fm.business.util.Constants;
import sv.com.fm.business.util.ServiceLocator;
import sv.com.fm.web.ui.recursohumano.rendered.VariosComboItemRendered;
import sv.com.fm.web.ui.util.BaseController;
import sv.com.fm.web.ui.util.MensajeMultilinea;

/**
 *
 * @author Carlos Godoy
 */
public class PreparacionesEmpleadoMttoCtrl extends BaseController {

    private static final long serialVersionUID = -6102616129515843465L;
    private static final transient Logger logger = Logger.getLogger(PreparacionesEmpleadoMttoCtrl.class.getCanonicalName());
    //Componentes ZUL
    protected Window preparacionesEmpleadoMttoWindow;
    protected Label lblNombrePlanillaSelected;
    protected Combobox cmbEmpleadosPreparaciones;
    protected Button btnCerrarIngresoCantidadPreparaciones;
    protected Button btnRefrescarIngresoCantidadPreparaciones;
    protected Button btnGuardarIngresoCantidadPreparaciones;
    protected Intbox intCantidadPrepNormales;
    protected Intbox intCantidadPrepEmbalsamado;
    protected Intbox intCantidadPrepEnjabado;
    //Services
    private ServiceLocator serviceLocator;
    private GestorPersonalBeanLocal personalBean;
    private UsuarioBeanLocal usuarioBean;
    //Variables de Negocio
    private Planilla planillaSelected;
    private List<PlanillaDetalle> listaPlanillaDetalles;
    private PlanillaDetalle planillaDetalleSelected;

    public PreparacionesEmpleadoMttoCtrl() {
        logger.log(Level.INFO, "[PreparacionesEmpleadoMttoCtrl]INIT");
        try {
            serviceLocator = ServiceLocator.getInstance();
            personalBean = serviceLocator.getService(Constants.JNDI_PERSONAL_FM_BEAN);
            usuarioBean = serviceLocator.getService(Constants.JNDI_USUARIOS_BEAN);
        } catch (ServiceLocatorException ex) {
            logger.log(Level.SEVERE, ex.getLocalizedMessage());
            ex.printStackTrace();
        }
    }

    public void onCreate$preparacionesEmpleadoMttoWindow(Event event) throws Exception {
        logger.log(Level.INFO, "[PreparacionesEmpleadoMttoCtrl][onCreate$preparacionesEmpleadoMttoWindow]");
        try {
            doOnCreateCommon(this.preparacionesEmpleadoMttoWindow, event);
            MensajeMultilinea.doSetTemplate();
            planillaSelected = null;
            if (this.args.containsKey("planillaSelected")) {
                planillaSelected = (Planilla) this.args.get("planillaSelected");
                lblNombrePlanillaSelected.setValue(planillaSelected.getDescripcionPlanilla());
            }
            llenarDatosCampos();
            revisarEstadoComponentes();
            preparacionesEmpleadoMttoWindow.doModal();
        } catch (Exception e) {
            logger.log(Level.SEVERE, e.getLocalizedMessage());
            e.printStackTrace();
        }
    }

    public void onChanging$cmbEmpleadosPreparaciones(ForwardEvent event) {
        logger.log(Level.INFO, "[GestionIngresosDescuentosCtrl][onChanging$cmbEmpleadosPreparaciones]");
        try {
            listaPlanillaDetalles = null;
            InputEvent input = (InputEvent) event.getOrigin();
            if (planillaSelected != null && StringUtils.isNotBlank(input.getValue())) {
                listaPlanillaDetalles = personalBean.obtenerPlanillasDetallesPorCriterio(planillaSelected.getCodigoPlanilla(), input.getValue(), Boolean.TRUE);
            }
            renderizarDatosPlanillaDetalle();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void renderizarDatosPlanillaDetalle() {
        logger.log(Level.INFO, "[GestionIngresosDescuentosCtrl][renderizarDatosPlanillaDetalle]");
        try {
            planillaDetalleSelected = null;
            if (listaPlanillaDetalles == null) {
                listaPlanillaDetalles = new ArrayList<PlanillaDetalle>();
            }
            cmbEmpleadosPreparaciones.setModel(new ListModelList(listaPlanillaDetalles));
            cmbEmpleadosPreparaciones.setItemRenderer(new VariosComboItemRendered());
            llenarDatosCampos();
            revisarEstadoComponentes();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onSelect$cmbEmpleadosPreparaciones(Event event) {
        logger.log(Level.INFO, "[GestionIngresosDescuentosCtrl][onChanging$cmbEmpleadosPreparaciones]");
        Comboitem itm;
        try {
            planillaDetalleSelected = null;
            itm = cmbEmpleadosPreparaciones.getSelectedItem();
            if (itm != null) {
                planillaDetalleSelected = (PlanillaDetalle) itm.getAttribute("data");
            }
            llenarDatosCampos();
            revisarEstadoComponentes();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void llenarDatosCampos() {
        logger.log(Level.INFO, "[PreparacionesEmpleadoMttoCtrl][llenarDatosCampos]");
        try {
            intCantidadPrepNormales.setValue(planillaDetalleSelected!=null?planillaDetalleSelected.getCantPreparacionNormal():null);
            intCantidadPrepEmbalsamado.setValue(planillaDetalleSelected!=null?planillaDetalleSelected.getCantPreparacionEmbalsam():null);
            intCantidadPrepEnjabado.setValue(planillaDetalleSelected!=null?planillaDetalleSelected.getCantPreparacionEnjabado():null);
            if(planillaDetalleSelected==null){
                cmbEmpleadosPreparaciones.setValue(null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void revisarEstadoComponentes() {
        logger.log(Level.INFO, "[PreparacionesEmpleadoMttoCtrl][revisarEstadoComponentes]");
        try {
            intCantidadPrepNormales.setReadonly(planillaDetalleSelected == null);
            intCantidadPrepEmbalsamado.setReadonly(planillaDetalleSelected == null);
            intCantidadPrepEnjabado.setReadonly(planillaDetalleSelected == null);
            btnRefrescarIngresoCantidadPreparaciones.setDisabled(planillaDetalleSelected == null);
            btnGuardarIngresoCantidadPreparaciones.setDisabled(planillaDetalleSelected == null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onClick$btnCerrarIngresoCantidadPreparaciones(Event event) {
        logger.log(Level.INFO, "[PreparacionesEmpleadoMttoCtrl][onClick$btnCerrarIngresoCantidadPreparaciones]");
        try {
            this.preparacionesEmpleadoMttoWindow.onClose();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onClick$btnRefrescarIngresoCantidadPreparaciones(Event event) {
        logger.log(Level.INFO, "[PreparacionesEmpleadoMttoCtrl][onClick$btnRefrescarIngresoCantidadPreparaciones]");
        try {
            listaPlanillaDetalles = null;
            renderizarDatosPlanillaDetalle();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onClick$btnGuardarIngresoCantidadPreparaciones(Event event) {
        logger.log(Level.INFO, "[PreparacionesEmpleadoMttoCtrl][onClick$btnGuardarIngresoCantidadPreparaciones]");
        GenericResponse resp;
        try {
            if (planillaDetalleSelected == null) {
                throw new FmWebException(Constants.CODE_OPERATION_EXCEPTION, "Debe de seleccionar un empleado!!");
            }
            if (intCantidadPrepNormales.getValue() == null) {
                throw new FmWebException(Constants.CODE_OPERATION_EXCEPTION, "Ingrese la cantidad de preparaciones normales!!");
            }
            if (intCantidadPrepEmbalsamado.getValue() == null) {
                throw new FmWebException(Constants.CODE_OPERATION_EXCEPTION, "Ingrese la cantidad de preparaciones embalsamadas!!");
            }
            if (intCantidadPrepEnjabado.getValue() == null) {
                throw new FmWebException(Constants.CODE_OPERATION_EXCEPTION, "Ingrese la cantidad de preparaciones enjabadas!!");
            }
            planillaDetalleSelected.setCantPreparacionNormal(intCantidadPrepNormales.getValue());
            planillaDetalleSelected.setCantPreparacionEmbalsam(intCantidadPrepEmbalsamado.getValue());
            planillaDetalleSelected.setCantPreparacionEnjabado(intCantidadPrepEnjabado.getValue());
            planillaDetalleSelected.setEstadoRegistro(Boolean.TRUE);
            planillaDetalleSelected.setFechaEvento(new Date());
            planillaDetalleSelected.setCodigoEmpleadoUsuario(getUserLogin().getUsuario());
            resp = usuarioBean.saveOrModifyEntity(planillaDetalleSelected, planillaDetalleSelected.getCodigoDetallePlanilla() == null);//Boolean.TRUE
            if (resp.getCodigoRespuesta().intValue() == Constants.CODE_OPERATION_OK.intValue()) {
//                if (resp.getObjeto() != null) {
//                    planillaDetalleSelected = (PlanillaDetalle) resp.getObjeto();
//                }
                MensajeMultilinea.show("Registro almacenado exitosamente!!", Constants.MENSAJE_TIPO_INFO);
                listaPlanillaDetalles = null;
                renderizarDatosPlanillaDetalle();
            } else {
                MensajeMultilinea.show(resp.getMensajeRespuesta(), Constants.MENSAJE_TIPO_ERROR);
            }
        } catch (FmWebException fwe) {
            MensajeMultilinea.show(fwe.getMensaje(), Constants.MENSAJE_TIPO_ALERTA);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
