package com.rjconsultores.ventaboletos.web.gui.controladores.comissao;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;

import com.rjconsultores.ventaboletos.entidad.Conferencia;
import com.rjconsultores.ventaboletos.entidad.LogConferencia;
import com.rjconsultores.ventaboletos.enums.comissao.StatusLogConferencia;
import com.rjconsultores.ventaboletos.enums.comissao.TipoLogConferencia;
import com.rjconsultores.ventaboletos.service.ConferenciaComissaoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.comissao.BoletoComissao;
import com.rjconsultores.ventaboletos.vo.comissao.EventosFinanceirosVO;
import com.rjconsultores.ventaboletos.vo.comissao.LogConferenciaVO;
import com.rjconsultores.ventaboletos.vo.comissao.OcdVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;

@Scope("prototype")
@Controller("editarLogConferenciaComissaoController")
public class EditarLogConfenciaComissaoController extends MyGenericForwardComposer {
	
	private static final long serialVersionUID = 1L;
	
	private static final Logger log = Logger.getLogger(EditarLogConfenciaComissaoController.class);

	@Autowired
	private ConferenciaComissaoService conferenciaComissaoService;
	
	private MyListbox logsConferenciaList;
	private MyListbox atualizarList;
	
	private MyTextboxDecimal txtPrecoLog;
	private MyTextbox txtObservacaoLog;
	
	private Conferencia conferencia;
	private BoletoComissao boletoComissao; 
	private EventosFinanceirosVO eventosFinanceiros;
	private OcdVO ocd;
	
	private Radio rDebito;
	
    @Override
    public void doAfterCompose(Component comp) throws Exception {
    	boletoComissao = (BoletoComissao) Executions.getCurrent().getArg().get("boletoComissao");
    	eventosFinanceiros = (EventosFinanceirosVO) Executions.getCurrent().getArg().get("eventosFinanceiros");
    	ocd = (OcdVO) Executions.getCurrent().getArg().get("ocd");
    	conferencia = (Conferencia) Executions.getCurrent().getArg().get("conferencia");
    	logsConferenciaList = (MyListbox) Executions.getCurrent().getArg().get("logsConferenciaList");
    	
    	if(Executions.getCurrent().getArg().containsKey("ocdsList")) {
    		atualizarList = (MyListbox) Executions.getCurrent().getArg().get("ocdsList");
    	} else if(Executions.getCurrent().getArg().containsKey("eventosFinanceirosList")) {
    		atualizarList = (MyListbox) Executions.getCurrent().getArg().get("eventosFinanceirosList");
    	} else if(Executions.getCurrent().getArg().containsKey("bilhetesList")) {
    		atualizarList = (MyListbox) Executions.getCurrent().getArg().get("bilhetesList");
    	}
    	
        super.doAfterCompose(comp);
        
        rDebito.setChecked(Boolean.TRUE);
        
    }
    
    public void onClick$btnSalvar(Event ev) throws InterruptedException {
    	try {
    		
    		if(validarCamposObservacao()) {
    			
				LogConferencia logConferencia = new LogConferencia();
				logConferencia.setPreco(txtPrecoLog.getValueDecimal());
				logConferencia.setObservacao(txtObservacaoLog.getValue());
				logConferencia.setConferencia(conferencia);
				logConferencia.setStatus(StatusLogConferencia.PENDENCIA);
				logConferencia.setTipo(TipoLogConferencia.AVULSO);
				logConferencia.setIndcredito(!rDebito.isChecked());
				
				if(boletoComissao != null) {
					logConferencia.setBoletoId(boletoComissao.getBoletoId());
					logConferencia.setTipo(TipoLogConferencia.BOLETO);
					boletoComissao.setStatus(logConferencia.getStatus().getValue());
					boletoComissao.setConferido(Boolean.TRUE);
				}
				
				if(eventosFinanceiros != null) {
					logConferencia.setEventoextraId(eventosFinanceiros.getEventoextraId());
					logConferencia.setTipo(TipoLogConferencia.EVENTO_FINANCEIRO);
					eventosFinanceiros.setStatus(logConferencia.getStatus().getValue());
				}
				
				if(ocd != null) {
					logConferencia.setOcdId(ocd.getOcdId());
					logConferencia.setTipo(TipoLogConferencia.OCD);
					ocd.setStatus(logConferencia.getStatus().getValue());
				}
				
				conferenciaComissaoService.suscribirLogConferencia(logConferencia);
	
				atualizarLogConferenciaList(logConferencia);
				atualizarList();
				
	            Messagebox.show(Labels.getLabel("conferenciaController.msg.adicionarLogConferencia"),
	    				Labels.getLabel("conferenciaController.window.title"),
	    				Messagebox.OK,Messagebox.INFORMATION);
	            
	            closeWindow();
            
    		}

		} catch (Exception e) {
			log.error(e.getMessage(), e);
		    Messagebox.show(Labels.getLabel("MSG.Error"),
		    				Labels.getLabel("conferenciaController.window.title"),
		    				Messagebox.OK,Messagebox.ERROR);
		}    	
    }

	private boolean validarCamposObservacao() throws InterruptedException {
		try {
			if(StringUtils.isBlank(txtObservacaoLog.getValue())) {
				Messagebox.show(Labels.getLabel("conferenciaController.MSG.observacaoObrigatorio"),
						Labels.getLabel("conferenciaController.window.title"),
						Messagebox.OK,Messagebox.ERROR);
				return false;
			}
		} catch (Exception e) {
		    Messagebox.show(Labels.getLabel("conferenciaController.MSG.observacaoObrigatorio"),
    						Labels.getLabel("conferenciaController.window.title"),
    						Messagebox.OK,Messagebox.ERROR);
		    return false;
		}
		return true;
	}

	private void atualizarList() {
		if(boletoComissao != null) {
			atualizarList.updateItem(boletoComissao);
		} else if(eventosFinanceiros != null) {
			atualizarList.updateItem(eventosFinanceiros);
		} else if(ocd != null) {
			atualizarList.updateItem(ocd);
		}
	}

	private void atualizarLogConferenciaList(LogConferencia logConferencia) {
		LogConferenciaVO logConferenciaVO = new LogConferenciaVO();
		logConferenciaVO.setLogconferenciaId(logConferencia.getLogconferenciaId());
		logConferenciaVO.setBoletoId(logConferencia.getBoletoId());
		logConferenciaVO.setEventoextraId(logConferencia.getEventoextraId());
		logConferenciaVO.setOcdId(logConferencia.getOcdId());
		logConferenciaVO.setFecmodif(logConferencia.getFecmodif());
		logConferenciaVO.setNombusuario(UsuarioLogado.getUsuarioLogado().getNombusuario());
		if(boletoComissao != null) {
			logConferenciaVO.setNumfoliosistema(boletoComissao.getNumFolioSistema());
		}
		logConferenciaVO.setObservacao(logConferencia.getObservacao());
		logConferenciaVO.setPreco(logConferencia.getPreco());
		logConferenciaVO.setStatus(logConferencia.getStatus().getValue());
		logConferenciaVO.setTipo(logConferencia.getTipo().getValue());
		logsConferenciaList.updateItem(logConferenciaVO);
	}
	
}
