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

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.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.Combobox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Tab;

import com.rjconsultores.ventaboletos.entidad.Conferencia;
import com.rjconsultores.ventaboletos.entidad.ConferenciaPendencia;
import com.rjconsultores.ventaboletos.entidad.LogConferencia;
import com.rjconsultores.ventaboletos.entidad.TipoInformativoComissao;
import com.rjconsultores.ventaboletos.enums.comissao.StatusLogConferencia;
import com.rjconsultores.ventaboletos.enums.comissao.TipoLogConferencia;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ConferenciaComissaoService;
import com.rjconsultores.ventaboletos.service.ConferenciaPendenciaService;
import com.rjconsultores.ventaboletos.service.TipoInformativoComissaoService;
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.MyComboboxEstandar;
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 Logger log = LogManager.getLogger(EditarLogConfenciaComissaoController.class);

	@Autowired
	private ConferenciaComissaoService conferenciaComissaoService;
	
	@Autowired
	private TipoInformativoComissaoService tipoInformativoComissaoService;
	
	@Autowired
	private ConferenciaPendenciaService conferenciaPendenciaService;
	
	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;
	private Radio rCredito;
	private Radio rInformativo;
	
	private Radio rMsmDia;
	private Radio rDiaPosterior;

	private Combobox cmbTipoInformativo;
	private List<TipoInformativoComissao> lsTipoInformativo;
	
	private MyComboboxEstandar cmbConferenciaPendencia;
	private List<ConferenciaPendencia> lsConferenciaPendencia;
	
	private Tab tab;
	
    @Override
    public void doAfterCompose(Component comp) throws Exception {
    	lsTipoInformativo = tipoInformativoComissaoService.obtenerTodos();
    	boletoComissao = (BoletoComissao) Executions.getCurrent().getArg().get("boletoComissao");
    	eventosFinanceiros = (EventosFinanceirosVO) Executions.getCurrent().getArg().get("eventosFinanceiros");
    	ocd = (OcdVO) Executions.getCurrent().getArg().get("ocd");
    	conferencia = getConferencia(comp);
    	logsConferenciaList = (MyListbox) Executions.getCurrent().getArg().get("logsConferenciaList");
    	tab = (Tab) Executions.getCurrent().getArg().get("tab");
    	
    	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");
    	}

		lsConferenciaPendencia = new ArrayList<ConferenciaPendencia>();
		lsConferenciaPendencia.add(new ConferenciaPendencia(-1, " "));
		lsConferenciaPendencia.addAll(conferenciaPendenciaService.obtenerTodos());
    	
		
        super.doAfterCompose(comp);
        
        rDebito.setChecked(Boolean.TRUE);
        rMsmDia.setChecked(Boolean.TRUE);
        
    }
    
	private Conferencia getConferencia(Component comp) {
		Conferencia c = (Conferencia) Executions.getCurrent().getArg().get("conferencia");

		if (c == null) {
			if (boletoComissao != null && boletoComissao.getConferencia() != null) {
				c = boletoComissao.getConferencia();
			} else if (ocd != null && ocd.getConferencia() != null) {
				c = ocd.getConferencia();
			} else if (eventosFinanceiros != null && eventosFinanceiros.getConferencia() != null) {
				c = eventosFinanceiros.getConferencia();
			}
		}
		return c;
	}

	private Short getDebitoCreditoInfo(){
		if(rCredito.isSelected()){
			return (short) 1;
		}else if(rDebito.isSelected()){
			return (short) 0;
		}else{
			return (short) 2;
		}
	}
	
    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(getDebitoCreditoInfo());
				logConferencia.setIndmesmodia(rMsmDia.isSelected());
				if(logConferencia.isIndcredito().equals((short) 2)){
					logConferencia.setTipoInformativoComissao((TipoInformativoComissao)cmbTipoInformativo.getSelectedItem().getValue());
				}
				
				if(boletoComissao != null) {
					logConferencia.setCajaId(boletoComissao.getCajaId());
					logConferencia.setTipo(TipoLogConferencia.BOLETO);
				}
				
				if(eventosFinanceiros != null) {
					logConferencia.setEventoextraId(eventosFinanceiros.getEventoextraId());
					logConferencia.setTipo(TipoLogConferencia.EVENTO_FINANCEIRO);
				}
				
				if(ocd != null) {
					logConferencia.setOcdId(ocd.getOcdId());
					logConferencia.setTipo(TipoLogConferencia.OCD);
				}
				
				if(cmbConferenciaPendencia.getSelectedItem() != null) {
					ConferenciaPendencia conferenciaPendencia = (ConferenciaPendencia) cmbConferenciaPendencia.getSelectedItem().getValue();
					if(conferenciaPendencia.getConferenciapendenciaId() > -1) {
						logConferencia.setConferenciaPendencia(conferenciaPendencia);
					}
				}
				
				logConferencia = conferenciaComissaoService.suscribirLogConferencia(logConferencia);
				
				if(boletoComissao != null) {
					boletoComissao.setStatus(logConferencia.getStatus().getValue());
					boletoComissao.setConferido(Boolean.TRUE);
					boletoComissao.setLogconferenciaId(logConferencia.getLogconferenciaId());
				}
				
				if(eventosFinanceiros != null) {
					eventosFinanceiros.setStatus(logConferencia.getStatus().getValue());
					eventosFinanceiros.setConferido(Boolean.TRUE);
					eventosFinanceiros.setLogconferenciaId(logConferencia.getLogconferenciaId());
				}
				
				if(ocd != null) {
					ocd.setStatus(logConferencia.getStatus().getValue());
					ocd.setConferido(Boolean.TRUE);
					ocd.setLogconferenciaId(logConferencia.getLogconferenciaId());
				}
				
				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(rInformativo.isSelected() && cmbTipoInformativo.getValue() == null){
				cmbTipoInformativo.getValue();
				return false;
			}
			}catch(Exception e){
				Messagebox.show(Labels.getLabel("conferenciaController.MSG.tipoInfomativoObrigatorio"),
						Labels.getLabel("conferenciaController.window.title"),
						Messagebox.OK,Messagebox.ERROR);
				return false;
			}

		try {
			ConferenciaPendencia conferenciaPendencia = (ConferenciaPendencia) cmbConferenciaPendencia.getSelectedItem().getValue();
			if((conferenciaPendencia == null || conferenciaPendencia.getConferenciapendenciaId() == -1) &&  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;
	}

	@SuppressWarnings("unchecked")
	private void atualizarList() throws BusinessException {
		if(boletoComissao != null) {
			atualizarList.updateItem(boletoComissao);
			verificarBilhetesSemConferencia((List<BoletoComissao>)atualizarList.getListData(), tab);
		} else if(eventosFinanceiros != null) {
			atualizarList.updateItem(eventosFinanceiros);
			verificarEventosFinanceirosSemConferencia((List<EventosFinanceirosVO>)atualizarList.getListData(), tab);
		} else if(ocd != null) {
			atualizarList.updateItem(ocd);
			verificarOcdsSemConferencia((List<OcdVO>)atualizarList.getListData(), tab);
		}
	}

	private void atualizarLogConferenciaList(LogConferencia logConferencia) {
		LogConferenciaVO logConferenciaVO = new LogConferenciaVO();
		logConferenciaVO.setLogconferenciaId(logConferencia.getLogconferenciaId());
		logConferenciaVO.setConferencia(conferencia);
		logConferenciaVO.setCajaId(logConferencia.getCajaId());
		logConferenciaVO.setEventoextraId(logConferencia.getEventoextraId());
		logConferenciaVO.setOcdId(logConferencia.getOcdId());
		logConferenciaVO.setFecmodif(logConferencia.getFecmodif());
		logConferenciaVO.setNombusuario(UsuarioLogado.getUsuarioLogado().getNombusuario());
		logConferenciaVO.setDescComportamentoData(logConferencia.getIndmesmodia() ? "1" : "0");
		if(boletoComissao != null) {
			logConferenciaVO.setNumfoliosistema(boletoComissao.getNumFolioSistema());
		}
		logConferenciaVO.setDesctipoinformativo(logConferencia.getTipoInformativoComissao() != null ? 
				logConferencia.getTipoInformativoComissao().getDesctipo() : null);
		logConferenciaVO.setObservacao(logConferencia.getObservacao());
		logConferenciaVO.setPreco(logConferencia.getPreco());
		logConferenciaVO.setStatus(logConferencia.getStatus().getValue());
		logConferenciaVO.setTipo(logConferencia.getTipo().getValue());
		logConferenciaVO.setIndcredito(logConferencia.isIndcredito());
		logConferenciaVO.setDescpendencia(logConferencia.getConferenciaPendencia() != null ? logConferencia.getConferenciaPendencia().getDescpendencia() : "");
		logsConferenciaList.updateItem(logConferenciaVO);
	}

	public List<TipoInformativoComissao> getLsTipoInformativo() {
		return lsTipoInformativo;
	}

	public void setLsTipoInformativo(List<TipoInformativoComissao> lsTipoInformativo) {
		this.lsTipoInformativo = lsTipoInformativo;
	}
	
	public void onClick$rInformativo(){
		hideShowTipoInformativo(false);
	}
	
	public void onClick$rDebito(){
		hideShowTipoInformativo(true);
	}
	
	public void onClick$rCredito(){
		hideShowTipoInformativo(true);
	}
	
	private void hideShowTipoInformativo(Boolean disable){
		cmbTipoInformativo.setDisabled(disable);
		
		if(!disable){
			cmbTipoInformativo.setConstraint("no empty");
		}else{
			cmbTipoInformativo.setConstraint("");
			cmbTipoInformativo.clearErrorMessage();
			cmbTipoInformativo.setValue(null);
		}
	}

	public List<ConferenciaPendencia> getLsConferenciaPendencia() {
		return lsConferenciaPendencia;
	}

	public void setLsConferenciaPendencia(List<ConferenciaPendencia> lsConferenciaPendencia) {
		this.lsConferenciaPendencia = lsConferenciaPendencia;
	}
	
	private void verificarBilhetesSemConferencia(List<BoletoComissao> lsBilhetes, Tab tab) throws BusinessException {
		if(conferenciaComissaoService.isBilhetesSemConferencia(lsBilhetes)) {
			setTabExigeConferencia(tab);
		} else {
			setTabNaoExigeConferencia(tab);
		}
	}
	
	private void verificarOcdsSemConferencia(List<OcdVO> lsOcds, Tab tab) throws BusinessException {
		if(conferenciaComissaoService.isOcdSemConferencia(lsOcds)) {
			setTabExigeConferencia(tab);
		} else {
			setTabNaoExigeConferencia(tab);
		}
	}
	
	private void verificarEventosFinanceirosSemConferencia(List<EventosFinanceirosVO> lsEventosFinanceiros, Tab tab) throws BusinessException {
		if(conferenciaComissaoService.isEventosFinanceirosSemConferencia(lsEventosFinanceiros)) {
			setTabExigeConferencia(tab);
		} else {
			setTabNaoExigeConferencia(tab);
		}
	}
	
	private void setTabNaoExigeConferencia(Tab tab) {
		tab.setSclass("semConferencia");
		tab.invalidate();
	}

	private void setTabExigeConferencia(Tab tab) {
		tab.setSclass("existeConferencia");
		tab.invalidate();
	}

	
}
