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

import java.text.SimpleDateFormat;
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.Datebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioHistoricoClientes;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.RutaService;
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.RenderRelatorioLinhaHorario;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiro;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiroSelecionados;

@Controller("relatorioHistoricoClientesController")
@Scope("prototype")
public class RelatorioHistoricoClientesController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private Datebox dtVendaInicial;
	private Datebox dtVendaFinal;
	private Datebox dtEmbarqueInicial;
	private Datebox dtEmbarqueFinal;

	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;

	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;
	private MyTextbox txtNombrePuntoVenta;
	private Bandbox bbPesquisaPuntoVenta;
	private Paging pagingPuntoVenta;
	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelList;
	
	private ArrayList<Ruta> lsNumLinha = new ArrayList<Ruta>();
	private MyListbox linhaList;
	private MyListbox linhaListSelList;
	private Textbox txtPalavraPesquisaLinha;
	private Checkbox chcAgrupar;

	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private RutaService rutaService;

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

		puntoVentaList.setItemRenderer(new RenderRelatorioVendasBilheteiro());
		puntoVentaSelList.setItemRenderer(new RenderRelatorioVendasBilheteiroSelecionados());
		
		linhaList.setItemRenderer(new RenderRelatorioLinhaHorario());
		linhaListSelList.setItemRenderer(new RenderRelatorioLinhaHorario());
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		Relatorio relatorio;
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");

		if (!validar()) {
			return;
		}

		if (dtVendaInicial.getValue() != null) {
			filtro.append("Data Venda: ")
					.append(format.format(dtVendaInicial.getValue()))
					.append(" - ")
					.append(format.format(dtVendaFinal.getValue()))
					.append(";");
		}

		if (dtEmbarqueInicial.getValue() != null) {
			filtro.append("Data Embarque: ")
					.append(format.format(dtEmbarqueInicial.getValue()))
					.append(" - ")
					.append(format.format(dtEmbarqueFinal.getValue()))
					.append(";");
		}

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

			puntoVentaIds = puntoVentaIds.substring(0, puntoVentaIds.length() - 1);
			puntoVentas = puntoVentas.substring(0, puntoVentas.length() - 1);
			parametros.put("NUMPUNTOVENTA", puntoVentaIds);
		} else {
			filtro.append("Todas  ");
		}

		filtro.append(puntoVentas).append(";");
		
		filtro.append("Linhas: ");
		String linhaIds = "";
		String linhas = "";
		List<Ruta> lsLinhasSelecionadas = new ArrayList(Arrays.asList(linhaListSelList.getData()));
		if (lsLinhasSelecionadas.size() > 0) {
			for (int i = 0; i < lsLinhasSelecionadas.size(); i++) {
				Ruta linha = lsLinhasSelecionadas.get(i);
				linhas += linha.getDescruta() + ",";
				linhaIds += linha.getRutaId() + ",";
			}

			linhaIds = linhaIds.substring(0, linhaIds.length() - 1);
			linhas = linhas.substring(0, linhas.length() - 1);
			parametros.put("NUMRUTA", linhaIds);
		} else {
			filtro.append("Todas  ");
		}

		filtro.append(linhas).append(";");

		parametros.put("DATA_VENDA_INICIAL", (java.util.Date) dtVendaInicial.getValue());
		parametros.put("DATA_VENDA_FINAL", (java.util.Date) dtVendaFinal.getValue());
		parametros.put("DATA_EMBARQUE_INICIAL", (java.util.Date) dtEmbarqueInicial.getValue());
		parametros.put("DATA_EMBARQUE_FINAL", (java.util.Date) dtEmbarqueFinal.getValue());

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

		lsNumLinha = new ArrayList(Arrays.asList(linhaListSelList.getData()));
		parametros.put("lsNumLinha", lsNumLinha);
		
		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(" Todas;  ");
		}

		parametros.put("FILTROS", filtro.toString());
		relatorio = new RelatorioHistoricoClientes(parametros, dataSourceRead.getConnection());

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

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

	private boolean validar() {
		try {
			if (dtVendaInicial.getValue() == null && dtVendaFinal.getValue() == null
					&& dtEmbarqueInicial.getValue() == null && dtEmbarqueFinal.getValue() == null) {
				Messagebox.show(Labels.getLabel("relatorioHistoricoClientesController.MSG.informarDatas"), Labels.getLabel("relatorioVendasBilheteiroController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return false;
			} else if ((dtVendaInicial.getValue() != null && dtVendaFinal.getValue() == null)
					|| (dtVendaFinal.getValue() != null && dtVendaInicial == null)) {
				Messagebox.show(Labels.getLabel("relatorioHistoricoClientesController.MSG.informarDataVenda"), Labels.getLabel("relatorioVendasBilheteiroController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return false;
			} else if ((dtEmbarqueInicial.getValue() != null && dtEmbarqueFinal.getValue() == null)
					|| (dtEmbarqueFinal.getValue() != null && dtEmbarqueInicial == null)) {
				Messagebox.show(Labels.getLabel("relatorioHistoricoClientesController.MSG.informarDataEmbarque"), Labels.getLabel("relatorioVendasBilheteiroController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return false;
			}
		} catch (InterruptedException ex) {
			return false;
		}
		return true;
	}

	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 onDoubleClick$linhaList(Event ev) {
		Ruta rutaAux = (Ruta) linhaList.getSelected();
		linhaListSelList.addItemNovo(rutaAux);
	}

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

	public void onClick$btnLimparLinha(Event ev) {
		linhaList.setData(new ArrayList<Ruta>());
		txtPalavraPesquisaLinha.setText("");
	}
	
	public void onClick$btnPesquisaLinha(Event ev) {
		executarPesquisaLinha();
	}
	
	private void executarPesquisaLinha() {

		String palavraPesquisaRuta = txtPalavraPesquisaLinha.getText();
		linhaList.setData(rutaService.buscaRuta(palavraPesquisaRuta));

		if (linhaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioLinhasHorarioController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}
	
	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

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

	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

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

	public PagedListWrapper<PuntoVenta> getPlwPuntoVenta() {
		return plwPuntoVenta;
	}

	public void setPlwPuntoVenta(PagedListWrapper<PuntoVenta> plwPuntoVenta) {
		this.plwPuntoVenta = plwPuntoVenta;
	}

	public MyTextbox getTxtNombrePuntoVenta() {
		return txtNombrePuntoVenta;
	}

	public void setTxtNombrePuntoVenta(MyTextbox txtNombrePuntoVenta) {
		this.txtNombrePuntoVenta = txtNombrePuntoVenta;
	}

	public MyListbox getPuntoVentaList() {
		return puntoVentaList;
	}

	public void setPuntoVentaList(MyListbox puntoVentaList) {
		this.puntoVentaList = puntoVentaList;
	}

	public MyListbox getPuntoVentaSelList() {
		return puntoVentaSelList;
	}

	public void setPuntoVentaSelList(MyListbox puntoVentaSelList) {
		this.puntoVentaSelList = puntoVentaSelList;
	}

	public Datebox getDtVendaInicial() {
		return dtVendaInicial;
	}

	public void setDtVendaInicial(Datebox dtVendaInicial) {
		this.dtVendaInicial = dtVendaInicial;
	}

	public Datebox getDtVendaFinal() {
		return dtVendaFinal;
	}

	public void setDtVendaFinal(Datebox dtVendaFinal) {
		this.dtVendaFinal = dtVendaFinal;
	}

	public Datebox getDtEmbarqueInicial() {
		return dtEmbarqueInicial;
	}

	public void setDtEmbarqueInicial(Datebox dtEmbarqueInicial) {
		this.dtEmbarqueInicial = dtEmbarqueInicial;
	}

	public Datebox getDtEmbarqueFinal() {
		return dtEmbarqueFinal;
	}

	public void setDtEmbarqueFinal(Datebox dtEmbarqueFinal) {
		this.dtEmbarqueFinal = dtEmbarqueFinal;
	}

	
}
