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

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.Longbox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Transportadora;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLegalizacaoMassiva;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.TransportadoraService;
import com.rjconsultores.ventaboletos.service.VoucherService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.configuracioneccomerciales.VoucherVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPadrao;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Controller("legalizacaoMassivaController")
@Scope("prototype")
public class LegalizacaoMassivaController extends MyGenericForwardComposer {

	private static Logger log = LogManager.getLogger(LegalizacaoMassivaController.class); 
	private static final long serialVersionUID = 1L;
	private static final String TITULO = "legalizacaoMassivaController.window.title";
	private static final String ESPACO = " ";
	
	@Autowired
	private VoucherService voucherService;
	
	@Autowired
	private ParadaService paradaService;
	
	@Autowired
	private TransportadoraService transportadoraService;
	
	private MyListbox voucherList;
	private Button btnImprimir;
	private Paging pagingLegalizar;
	private Longbox txtNumInicial;
	private Longbox txtNumFinal;
	private Textbox txtNumContrato;
	private Textbox txtNit;
	private Textbox txtNome;
	private Combobox cmbOrigem;
	private Combobox cmbDestino;
	private Button btnLegalizar;
	private Combobox cmbTransportadora;
	private Decimalbox txtValorLegalizado;
	
	private List<Transportadora> lsTransportadora;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		
		setLsTransportadora(transportadoraService.obtenerTodos());
		
		super.doAfterCompose(comp);

		voucherList.setItemRenderer(new RenderPadrao<VoucherVO>(VoucherVO.class));
		voucherList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				VoucherVO cc = (VoucherVO) voucherList.getSelected();
				verVoucher(cc);
			}
		});
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void verVoucher(VoucherVO gc) {
		if (gc == null) {
			return;
		}

		Map args = new HashMap();
		args.put("voucherId", gc.getVoucherId());

		openWindow("/gui/configuraciones_comerciales/negcorporativos/editarVoucher.zul",
				Labels.getLabel("editarVoucherController.window.title"), args, MODAL);
	}

	public void onClick$btnLegalizar(Event ev) throws InterruptedException {
		try {
			validaCampos();
			
			executaLegalizacao();
			
		} catch (BusinessException bex) {
			Messagebox.show(
					bex.getMessage(),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.ERROR);			
		} catch (Exception ex) {
			log.error(ex.getMessage());
			Messagebox.show(
						Labels.getLabel("MSG.Error"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
		}
		
	}
	
	public void onClick$btnImprimir(Event ev) throws InterruptedException {
		try {
			if(voucherList.getData() == null || voucherList.getData().length <= 1) {
				throw new BusinessException("legalizacaoMassivaController.MSG.noData");
			}
			
			imprimirLegalizacao();
			
		} catch (BusinessException bex) {
			Messagebox.show(
					bex.getMessage(),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.ERROR);			
		} catch (Exception ex) {
			log.error(ex.getMessage());
			Messagebox.show(
						Labels.getLabel("MSG.Error"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
		}
		
	}
	
	@SuppressWarnings("unchecked")
	private void imprimirLegalizacao() throws Exception {
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();

		parametros.put("TITULO", Labels.getLabel(TITULO));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario());
		
		filtro.append(Labels.getLabel("label.numInicial"));
		filtro.append(ESPACO);
		filtro.append(txtNumInicial.getValue());
		filtro.append(ESPACO);
		
		filtro.append(Labels.getLabel("label.numFinal"));
		filtro.append(ESPACO);
		filtro.append(txtNumFinal.getValue());
		filtro.append(ESPACO);
		
		Comboitem transp = cmbTransportadora.getSelectedItem();
		if (transp != null){
			filtro.append(Labels.getLabel("label.transportadora"));
			filtro.append(ESPACO);
			
			Transportadora tra = (Transportadora) transp.getValue();
			filtro.append( tra.getNomeTransportadora());
			filtro.append(ESPACO);
		}
		
		filtro.append(Labels.getLabel("label.numContrato"));
		filtro.append(ESPACO);
		parametros.put("numContrato", txtNumContrato.getValue());
		filtro.append(ESPACO);
		
		filtro.append(Labels.getLabel("label.valorLegalizado"));
		filtro.append(ESPACO);
		parametros.put("valorLegalizado", txtValorLegalizado.getValue());
		filtro.append(ESPACO);
		
		Comboitem ori = cmbOrigem.getSelectedItem();
		if (ori != null){
			filtro.append(Labels.getLabel("label.origem"));
			filtro.append(ESPACO);
			
			Parada orig = (Parada) ori.getValue();
			parametros.put("origem", orig.getDescparada());
			filtro.append(ESPACO);
		}
		
		Comboitem des = cmbDestino.getSelectedItem();
		if (des != null){
			filtro.append(Labels.getLabel("label.destino"));
			filtro.append(ESPACO);
			
			Parada dest = (Parada) des.getValue();
			parametros.put("destino", dest.getDescparada());
			filtro.append(ESPACO);
		}

		parametros.put("FILTROS", filtro.toString());
		
		Map<String, Object> args = new HashMap<String, Object>();
		
		RelatorioLegalizacaoMassiva relatorio = new RelatorioLegalizacaoMassiva(parametros, null);
		relatorio.setLsDadosRelatorio(voucherList.getListData());
		args.put("relatorio", relatorio);

		openWindow("/component/reportView.zul",	Labels.getLabel(TITULO), args, MODAL);
		
	}

	public void onBlur$txtNit(Event ev) throws InterruptedException {
		if(txtNit.getValue() != null && !txtNit.getValue().isEmpty()) {
			Transportadora transp = transportadoraService.buscarPorNit(txtNit.getValue());
			if(transp != null) {
				selecionaCombo(transp, cmbTransportadora);
				txtNumContrato.setFocus(true);
			}else {
				Messagebox.show(
						Labels.getLabel("legalizacaoMassivaController.MSG.nitNaoEncontrado"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
			}
		}
	}
	
	private void executaLegalizacao() {
		
		Transportadora transportadora;		
		transportadora = (Transportadora)cmbTransportadora.getSelectedItem().getValue();
		
		Parada origem = null;
		Comboitem orig = cmbOrigem.getSelectedItem();		
		if( orig != null ) {
			origem = (Parada)orig.getValue();
		}
		
		Parada destino = null;
		Comboitem dest = cmbDestino.getSelectedItem();		
		if( dest != null ) {
			destino = (Parada)dest.getValue();
		}
		
		List<VoucherVO> processamento = voucherService.legalizar( txtNumInicial.getValue(),
									  txtNumFinal.getValue(),
									  txtNumContrato.getValue(),
									  transportadora,
									  txtValorLegalizado.getValue(),
									  origem, 
									  destino);

		voucherList.setData(processamento);
		preencheComplemento();
		pagingLegalizar.setVisible(true);
		voucherList.setVisible(true);
		btnImprimir.setVisible(true);
	}

	private void validaCampos() throws BusinessException {
		if ( txtNumInicial.getValue() == null 
				|| txtNumFinal.getValue() == null 
				|| txtValorLegalizado.getValue() == null  
				|| cmbTransportadora.getSelectedItem() == null ){
			throw new BusinessException("legalizacaoMassivaController.MSG.camposObrigatorios");
		}		
	}
	
	private void preencheComplemento() {
		for (Object item : voucherList.getListData()) {
			VoucherVO obj = (VoucherVO)item;
			if( StringUtils.isEmpty(obj.getDescOrigem()) || StringUtils.isEmpty(obj.getDescDestino() )) {
				List<String> origemDestino = paradaService.buscarDescOrigemDestino(obj.getOrigenId(), obj.getDestinoId());
				if(! origemDestino.isEmpty() ) {
					obj.setDescOrigem( origemDestino.get(0) );
					obj.setDescDestino( origemDestino.get(1) );
				}
			}
		}
	}	
}
