/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios;

import java.sql.Connection;
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.Checkbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ComboitemRenderer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Radiogroup;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioTaxasLinha;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
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.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParadaCve;
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.RenderRelatorioTaxasLinhaPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioTaxasLinhaPuntoVentaSelecionados;

/**
 * 
 * @author Administrador
 */
@Controller("relatorioTaxasLinhaController")
@Scope("prototype")
public class RelatorioTaxasLinhaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;
	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private EmpresaService empresaService;
	private List<Empresa> lsEmpresa;
	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParadaCve cmbParadaOrigemCve;
	private MyComboboxParada cmbParadaDestino;
	private MyComboboxParadaCve cmbParadaDestinoCve;
	private Datebox datInicial;
	private Datebox datFinal;
	private MyTextbox txtNombrePuntoVenta;
	private Radiogroup rdGroupTipoData;
	private Checkbox chkSubtrairIcms;
	private MyComboboxEstandar cmbEmpresa;
	private Bandbox bbPesquisaPuntoVenta;
	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelList;
	private Paging pagingPuntoVenta;

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

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

		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("relatorioTaxasLinhaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();

		super.doAfterCompose(comp);

		cmbParadaOrigemCve.setItemRenderer(new ComboitemRenderer() {
			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Parada parada = (Parada) o;

				cmbtm.setLabel(parada.getCveparada());
				cmbtm.setValue(parada);
			}
		});

		cmbParadaDestinoCve.setItemRenderer(new ComboitemRenderer() {
			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Parada parada = (Parada) o;

				cmbtm.setLabel(parada.getCveparada());
				cmbtm.setValue(parada);
			}
		});

		puntoVentaList.setItemRenderer(new RenderRelatorioTaxasLinhaPuntoVenta());
		puntoVentaSelList.setItemRenderer(new RenderRelatorioTaxasLinhaPuntoVentaSelecionados());
	}

	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("");
	}

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

	/**
	 * @throws Exception
	 * 
	 */
	@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()) {
			puntoVentas = "Todas";
			puntoVentaIds = "Todas";
		} else {
			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);
		}
		filtro.append(puntoVentas).append(";");

		parametros.put("DATA_INICIAL", (java.util.Date) this.datInicial.getValue());
		parametros.put("DATA_FINAL", (java.util.Date) this.datFinal.getValue());
		parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioTaxasLinhaController.window.title"));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		parametros.put("TIPO_DATA", Integer.parseInt(rdGroupTipoData.getSelectedItem().getValue()));
		parametros.put("NUMPUNTOVENTA", puntoVentaIds);

		parametros.put("B_SUBTRAIR_ICMS", chkSubtrairIcms.isChecked());

		filtro.append(" Tipo de Data: " + (rdGroupTipoData.getSelectedItem().getValue().equals(1) ? " Origem;" : "Destino;"));
		filtro.append(" Subtrair ICMS: " + (chkSubtrairIcms.isChecked() ? " Sim;" : "Não;"));
		filtro.append(" Empresa: ");

		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			parametros.put("EMPRESA_ID", empresa.getEmpresaId());
			parametros.put("EMPRESA", empresa.getNombempresa());
			filtro.append(empresa.getNombempresa() + ";");
		} else {
			filtro.append("Todas;");
		}

		filtro.append(" Origem: ");
		Comboitem cbiOrigem = cmbParadaOrigem.getSelectedItem();
		if (cbiOrigem != null) {
			Parada origem = (Parada) cbiOrigem.getValue();
			parametros.put("ORIGEN_ID", origem.getParadaId());
			filtro.append(origem.getCveparada() + ";");
		} else {
			filtro.append("Todas;");
		}

		filtro.append(" Destino: ");
		Comboitem cbiDestino = cmbParadaDestino.getSelectedItem();
		if (cbiDestino != null) {
			Parada destino = (Parada) cbiDestino.getValue();
			parametros.put("DESTINO_ID", destino.getParadaId());
			filtro.append(destino.getCveparada() + ";");
		} else {
			filtro.append("Todos;");
		}

		Connection connection = dataSourceRead.getConnection();
		try{
			parametros.put("FILTROS", filtro.toString());
			relatorio = new RelatorioTaxasLinha(parametros, connection);
	
			Map args = new HashMap();
			args.put("relatorio", relatorio);
	
			openWindow("/component/reportView.zul",
					Labels.getLabel("relatorioTaxasLinhaController.window.title"), args, MODAL);
		}finally{
			if ( (connection != null) && !connection.isClosed()){
				connection.close();
			}
		}
	}

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

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

	public void onSelect$cmbParadaOrigemCve(Event ev) {
		if (cmbParadaOrigemCve.getSelectedItem() != null) {
			cmbParadaOrigem.setComboItemByParada((Parada) cmbParadaOrigemCve.getSelectedItem().getValue());
		}
	}

	public void onSelect$cmbParadaOrigem(Event ev) {
		if (cmbParadaOrigem.getSelectedItem() != null)
			cmbParadaOrigemCve.setComboItemByParada((Parada) cmbParadaOrigem.getSelectedItem().getValue());
	}

	public void onSelect$cmbParadaDestinoCve(Event ev) {
		if (cmbParadaDestinoCve.getSelectedItem() != null) {
			cmbParadaDestino.setComboItemByParada((Parada) cmbParadaDestinoCve.getSelectedItem().getValue());
		}
	}

	public void onSelect$cmbParadaDestino(Event ev) {
		if (cmbParadaDestino.getSelectedItem() != null) {
			cmbParadaDestinoCve.setComboItemByParada((Parada) cmbParadaDestino.getSelectedItem().getValue());
		}
	}
}
