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

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

import javax.sql.DataSource;

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
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.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioBPe;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioBpeNumeracaoReuso;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioBPeRejeitadoEnvioContingencia;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
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.render.RenderEstadoUf;

@Controller("relatorioBPeController")
@Scope("prototype")
public class RelatorioBPeController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private Datebox dtInicio;
	private Datebox dtFim;
	private MyComboboxEstandar cmbEmpresa;
	private Combobox cmbPuntoVenta;
	private Radio rdbStatus;
	private Radiogroup rdbGroup;
	private MyListbox estadoList;
	private Textbox txtChBpe;
	private Textbox txtNumBpe;
	private Checkbox chcAlias;

	private List<Empresa> lsEmpresa;
	private List<Estado> lsEstado;

	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private EstadoService estadoService;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		lsEstado = estadoService.obtenerTodos();
		super.doAfterCompose(comp);
		
		estadoList.setItemRenderer(new RenderEstadoUf());
		estadoList.setData(lsEstado);
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();

		if (!validar()) {
			return;
		}

		if (dtInicio.getValue() != null && dtFim.getValue() != null) {
			filtro.append("Data: ")
					.append(DateUtil.getStringDate(dtInicio.getValue(), "dd/MM/yyyy"))
					.append(" - ")
					.append(DateUtil.getStringDate(dtFim.getValue(), "dd/MM/yyyy"))
					.append(";");
			parametros.put("DATA_INICIO", (java.util.Date) dtInicio.getValue());
			parametros.put("DATA_FIM", (java.util.Date) dtFim.getValue());
		}


		parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioBPeController.window.title"));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		parametros.put("USUARIO_NOME", UsuarioLogado.getUsuarioLogado().getNombusuario());

		filtro.append("UF: ");
		String estadosIds = "";
		String UFs = "";
		String empresasIds = "";
		List<Object> lsEstadosSelecionados = estadoList.getItensSelecionados();

		if (!lsEstadosSelecionados.isEmpty()) {
			for (int i = 0; i < lsEstadosSelecionados.size(); i++) {
				Estado estado = (Estado) lsEstadosSelecionados.get(i);
				UFs = UFs + estado.getCveestado() + ",";
				estadosIds = estadosIds + estado.getEstadoId() + ",";
			}

			estadosIds = estadosIds.substring(0, estadosIds.length() - 1);
			UFs = UFs.substring(0, UFs.length() - 1);
			parametros.put("ESTADOS_ID", estadosIds);
		} else {
			filtro.append("Todos ");
		}

		filtro.append(UFs).append(";");
		
		filtro.append("Empresa: ");
		
	
		if (cmbEmpresa.getSelectedItem() == null && rdbGroup.getSelectedItem().getValue().equals("NR")) {
			for (int i = 0; i < lsEmpresa.size(); i++) {
				Empresa empresa = (Empresa) lsEmpresa.get(i);
				if(!BooleanUtils.toBoolean(empresa.getIndReaproveitarNumBPeRejeitado())){
					empresasIds = empresasIds + empresa.getEmpresaId() + ",";
				}				
			}
			empresasIds = empresasIds.substring(0, empresasIds.length() - 1);
			parametros.put("EMPRESA_ID", empresasIds);	
			filtro.append(" Todas; ");
		}else{
			Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
			if (itemEmpresa != null) {
				Empresa empresa = (Empresa) itemEmpresa.getValue();
				parametros.put("EMPRESA_ID", String.valueOf(empresa.getEmpresaId()));
				filtro.append(empresa.getNombempresa()).append(";");
			} else {
				filtro.append(" Todas; ");
			}
		}
		
		
		filtro.append(" Status: ").append(rdbGroup.getSelectedItem().getLabel()).append("; ");
		parametros.put("STATUS", rdbGroup.getSelectedItem().getValue());
		
		txtChBpe.getValue();
		if(StringUtils.isNotBlank(txtChBpe.getValue())) {
			filtro.append("Chave BP-e: ").append(txtChBpe.getValue()).append("; ");
			parametros.put("CHBPE", txtChBpe.getValue());
		}

		txtNumBpe.getValue();
		if(StringUtils.isNotBlank(txtNumBpe.getValue())) {
			filtro.append("Número BP-e: ").append(txtNumBpe.getValue()).append("; ");
			parametros.put("NUMBPE", txtNumBpe.getValue());
		}
		
		parametros.put("ALIAS", chcAlias.isChecked() ? "S" : "N");
		filtro.append("Alias: ").append(chcAlias.isChecked() ? "Sim" : "Não").append("; ");
		
		parametros.put("FILTROS", filtro.toString());
		
		Relatorio relatorio = null;
		if(rdbGroup.getSelectedItem().getValue().equals("RC") || rdbGroup.getSelectedItem().getValue().equals("R")) {
			relatorio = new RelatorioBPeRejeitadoEnvioContingencia(parametros, dataSourceRead.getConnection());
		} else if(rdbGroup.getSelectedItem().getValue().equals("NR")) {
			relatorio = new RelatorioBpeNumeracaoReuso(parametros, dataSourceRead.getConnection());
		}
		else {
			relatorio = new RelatorioBPe(parametros, dataSourceRead.getConnection());
		}

		Map args = new HashMap();
		args.put("relatorio", relatorio);

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

	private boolean validar() {
		

		try {
			if(rdbGroup.getSelectedItem().getValue().equals("NR")){
				if (cmbEmpresa.getSelectedItem() != null) {
					Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
					if(BooleanUtils.toBoolean(empresa.getIndReaproveitarNumBPeRejeitado())){
						Messagebox.show(Labels.getLabel("relatorioBPeController.MSG.NaoPermitirReusoBPE"),
								Labels.getLabel("relatorioBPeController.window.title"),
								Messagebox.OK, Messagebox.INFORMATION);
						return false;
					}
				}
			}
			if(rdbGroup.getSelectedItem().getValue().equals("T")){				
				List<Object> lsEstadosSelecionados = estadoList.getItensSelecionados();
				if ((lsEstadosSelecionados.isEmpty()) || (!lsEstadosSelecionados.isEmpty() && lsEstadosSelecionados.size() > 1)) {
					Messagebox.show(Labels.getLabel("relatorioBPeController.MSG.NaoPermitirTodasOpcoesEstado"),
							Labels.getLabel("relatorioBPeController.window.title"),
							Messagebox.OK, Messagebox.INFORMATION);
					return false;
				}
			}
			txtChBpe.getValue();
			txtNumBpe.getValue();
			
			boolean isFiltroChbpeOrNumbpe = StringUtils.isNotBlank(txtChBpe.getValue()) || StringUtils.isNotBlank(txtNumBpe.getValue());
			
			if(!isFiltroChbpeOrNumbpe) {
				if (dtInicio.getValue() == null || dtFim.getValue() == null) {
					Messagebox.show(Labels.getLabel("relatorioBPeController.MSG.informarData"),
							Labels.getLabel("relatorioBPeController.window.title"),
							Messagebox.OK, Messagebox.INFORMATION);
					return false;
				}
				
				if(dtInicio.getValue().after(dtFim.getValue())){
					Messagebox.show(Labels.getLabel("relatorioBPeController.MSG.dataInicialMaiorQueFinal"),
							Labels.getLabel("relatorioBPeController.window.title"),
							Messagebox.OK, Messagebox.INFORMATION);
					return false;
				}
			}
			
		} catch (InterruptedException ex) {
			return false;
		}
		return true;
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}

	public Datebox getDtInicio() {
		return dtInicio;
	}

	public void setDtInicio(Datebox dtInicio) {
		this.dtInicio = dtInicio;
	}

	public Datebox getDtFim() {
		return dtFim;
	}

	public void setDtFim(Datebox dtFim) {
		this.dtFim = dtFim;
	}

	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(MyComboboxEstandar cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public Combobox getCmbPuntoVenta() {
		return cmbPuntoVenta;
	}

	public void setCmbPuntoVenta(Combobox cmbPuntoVenta) {
		this.cmbPuntoVenta = cmbPuntoVenta;
	}

	public Radio getRdbStatus() {
		return rdbStatus;
	}

	public void setRdbStatus(Radio rdbStatus) {
		this.rdbStatus = rdbStatus;
	}

	public MyListbox getEstadoList() {
		return estadoList;
	}

	public void setEstadoList(MyListbox estadoList) {
		this.estadoList = estadoList;
	}

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

	public List<Estado> getLsEstado() {
		return lsEstado;
	}

	public void setLsEstado(List<Estado> lsEstado) {
		this.lsEstado = lsEstado;
	}

	public EmpresaService getEmpresaService() {
		return empresaService;
	}

	public void setEmpresaService(EmpresaService empresaService) {
		this.empresaService = empresaService;
	}

	public DataSource getDataSourceRead() {
		return dataSourceRead;
	}

	public void setDataSourceRead(DataSource dataSourceRead) {
		this.dataSourceRead = dataSourceRead;
	}

	public EstadoService getEstadoService() {
		return estadoService;
	}

	public void setEstadoService(EstadoService estadoService) {
		this.estadoService = estadoService;
	}
	
}
