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

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

import javax.sql.DataSource;

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.Bandbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.AidfTipo;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioEstoque;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.AidfService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
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.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiro;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiroSelecionados;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Controller("relatorioAidfDetalhadoController")
@Scope("prototype")
public class RelatorioAidfDetalhadoController extends MyGenericForwardComposer {

	private static final String TITULO = "relatorioAidfDetalhadoController.window.title";

	private static final String FILTRO_TODAS = "filtro.todas";

	private static final long serialVersionUID = 1L;

	private Datebox datInicial;
	private Datebox datFinal;	
	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;
    private Textbox txtSerie;
    private Textbox txtAIDF;
    private Textbox txtNumInicial;
    private Textbox txtNumFinal;
	private List<AidfTipo> lsAidfTipo;
	private Combobox cmbAidfTipo;
	private Intbox aidfIdIntBox;
	
    
    @Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;

	private MyTextbox txtNombrePuntoVenta;
    private Bandbox bbPesquisaPuntoVenta;
    private Paging pagingPuntoVenta;
    private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelList;
   

	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private DataSource dataSourceRead;	
	@Autowired
	private AidfService aidfService;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		super.doAfterCompose(comp);		
		
		puntoVentaList.setItemRenderer(new RenderRelatorioVendasBilheteiro());
		puntoVentaSelList.setItemRenderer(new RenderRelatorioVendasBilheteiroSelecionados());
		lsAidfTipo = aidfService.obtenerTodosAdifTipo();

	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		Relatorio relatorio;

		Map<String, Object> parametros = new HashMap<String, Object>();

		StringBuilder filtro = new StringBuilder();
		
		filtro.append("Agência: ");
		String puntoVentaIds = "";
		String puntoVentas = "";
		List<PuntoVenta> lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(puntoVentaSelList.getData()));
		if (!lsPuntoVentaSelecionados.isEmpty()) {
			for (int i = 0; i < lsPuntoVentaSelecionados.size(); i++) {
				PuntoVenta puntoVenta = lsPuntoVentaSelecionados.get(i);
				puntoVentas = puntoVentas + puntoVenta.getNombpuntoventa() + ",";
				puntoVentaIds = puntoVentaIds + puntoVenta.getPuntoventaId() + ",";
			}

			// removendo ultima virgula
			puntoVentaIds = puntoVentaIds.substring(0, puntoVentaIds.length() - 1);
			puntoVentas = puntoVentas.substring(0, puntoVentas.length() - 1);
			parametros.put("NUMPUNTOVENTA", puntoVentaIds);
		}else{
			filtro.append(Labels.getLabel(FILTRO_TODAS));
		}
		
		filtro.append(puntoVentas).append("; ");

		parametros.put("NOME_RELATORIO", Labels.getLabel(TITULO));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		parametros.put("USUARIO_NOME", UsuarioLogado.getUsuarioLogado().getNombusuario());
		parametros.put("DATA_INICIO", datInicial.getValue());
		parametros.put("DATA_FIM", datFinal.getValue());
		
		filtro.append("Empresa: ");
		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			parametros.put("EMPRESA_ID", empresa.getEmpresaId());
			filtro.append(empresa.getNombempresa() + "; ");
		} else {
			filtro.append(Labels.getLabel(FILTRO_TODAS));
		}
		Comboitem cmbItem = cmbAidfTipo.getSelectedItem();
		if (cmbItem != null) {
			AidfTipo aidfTipo = (AidfTipo) cmbItem.getValue();
			parametros.put("AIDFTIPO_ID", aidfTipo.getAidftipoId());
			filtro.append(aidfTipo.getDesctipo() + "; ");
		} else {
			filtro.append(Labels.getLabel(FILTRO_TODAS));
		}
		

		if (aidfIdIntBox.getValue() != null) {
			Integer aidfId = aidfIdIntBox.getValue();
			parametros.put("AIDF_ID", aidfId );
			filtro.append(aidfId + "; ");
		} else {
			filtro.append(Labels.getLabel(FILTRO_TODAS));
		}
		
		if (txtNumInicial.getValue() != null && !txtNumInicial.getValue().isEmpty()) {
			if (txtNumFinal.getValue() == null || txtNumFinal.getValue().isEmpty()) {
				Messagebox.show(
						Labels.getLabel("relatorioAidfDetalhadoController.MSG.rangeObrigatorio"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
				return;
			}
			
			String numInicial = txtNumInicial.getValue();
			parametros.put("NUM_INICIAL", numInicial );
			filtro.append(Labels.getLabel("label.numInicial"));
			filtro.append(numInicial + "; ");
		}
		
		if (txtNumFinal.getValue() != null && !txtNumFinal.getValue().isEmpty()) {
			if (txtNumInicial.getValue() == null || txtNumInicial.getValue().isEmpty()) {
				Messagebox.show(
						Labels.getLabel("relatorioAidfDetalhadoController.MSG.rangeObrigatorio"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
				return;
			}
			
			String numFinal = txtNumFinal.getValue();
			parametros.put("NUM_FINAL", numFinal );
			filtro.append(Labels.getLabel("label.numFinal"));
			filtro.append(numFinal + "; ");
		}
	
		parametros.put("FILTROS", filtro.toString());	
		relatorio = new RelatorioEstoque(parametros, dataSourceRead.getConnection());

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

		openWindow("/component/reportView.zul",	Labels.getLabel(TITULO), args, MODAL);
	}
	
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception{
		executarRelatorio();
	}

	private void executarPesquisa() {
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda =
				new HibernateSearchObject<PuntoVenta>(PuntoVenta.class, pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterILike("nombpuntoventa", "%" + txtNombrePuntoVenta.getValue() + "%");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);
		puntoVentaBusqueda.addFilterNotEqual("puntoventaId", -1);

		puntoVentaBusqueda.addSortAsc("nombpuntoventa");

		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		plwPuntoVenta.init(puntoVentaBusqueda, puntoVentaList, pagingPuntoVenta);

		if (puntoVentaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioVendasBilheteiroController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}

	public void onClick$btnPesquisa(Event ev) {
		executarPesquisa();
	}

	public void onDoubleClick$puntoVentaSelList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaSelList.getSelected();
		puntoVentaSelList.removeItem(puntoVenta);
	}

	public void onDoubleClick$puntoVentaList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaList.getSelected();
		puntoVentaSelList.addItemNovo(puntoVenta);
	}

	public void onClick$btnLimpar(Event ev) {
		puntoVentaList.setData(new ArrayList<PuntoVenta>());

		bbPesquisaPuntoVenta.setText("");
	}
}
