/**
 * 
 */
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.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.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.Radio;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasBilheteiroSintetico;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
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.RenderRelatorioCheckinUsuario;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioCheckinUsuariosSelecionados;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiroSintetico;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiroSinteticoSelecionados;

/**
 * @author Bruno Neves
 *
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
@Controller("relatorioVendasBilheteiroSinteticoController")
@Scope("prototype")
public class RelatorioVendasBilheteiroSinteticoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(RelatorioVendasBilheteiroSinteticoController.class);

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private TipoPuntoVentaService tipoPuntoVentaService;

	private Datebox datInicial;
	private Datebox datFinal;

	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;

	private MyComboboxEstandar cmbTipoPuntoVenta;
	private List<TipoPuntoVenta> lsTipoPuntoVenta;

	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;
	@Autowired
	private transient PagedListWrapper<Usuario> plwUsuario;

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

	private Textbox txtPalavraPesquisa;
	private Bandbox bbPesquisaBilhetero;
	private MyListbox usuarioList;
	private MyListbox usuarioSelList;
	private Paging pagingUsuario;

	private Checkbox checkboxTarifa;
	private Checkbox checkboxImportepedagio;
	private Checkbox checkboxImportetaxaembarque;
	private Checkbox checkboxImporteseguro;

	private Radio radBilheteiro;
	private Radio radDigitacao;
	private Radio radFechamento;

	private Radio radioDataVenda;

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

		puntoVentaList.setItemRenderer(new RenderRelatorioVendasBilheteiroSintetico());
		puntoVentaSelList.setItemRenderer(new RenderRelatorioVendasBilheteiroSinteticoSelecionados());

		usuarioList.setItemRenderer(new RenderRelatorioCheckinUsuario());
		usuarioSelList.setItemRenderer(new RenderRelatorioCheckinUsuariosSelecionados());

		checkboxTarifa.setChecked(true);
		checkboxImportepedagio.setChecked(true);
		checkboxImportetaxaembarque.setChecked(true);
		checkboxImporteseguro.setChecked(true);

		radBilheteiro.setChecked(true);
	}

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

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

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

	public void onClick$btnLimparUsu(Event ev) {
		usuarioList.setData(new ArrayList<Usuario>());

		bbPesquisaBilhetero.setText("");
	}

	public void onClick$btnPesquisaUsu(Event ev) {
		executarPesquisaUsu();
	}

	public void onDoubleClick$usuarioList(Event ev) {
		Usuario usuario = (Usuario) usuarioList.getSelected();
		usuarioSelList.addItemNovo(usuario);
	}

	private void executarPesquisaUsu() {
		HibernateSearchObject<Usuario> usuarioBusqueda = new HibernateSearchObject<Usuario>(Usuario.class,
				pagingUsuario.getPageSize());

		usuarioBusqueda.addFilterLike("nombusuario", "%" + txtPalavraPesquisa.getValue() + "%");

		usuarioBusqueda.addSortAsc("nombusuario");

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

		plwUsuario.init(usuarioBusqueda, usuarioList, pagingUsuario);

		if (usuarioList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("indexController.mniRelatorioCheckin.label"), Messagebox.OK,
						Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				log.error(ex);
			}
		}
	}

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

	private void executarRelatorio() throws Exception {
		Relatorio relatorio;
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();

		Boolean composicaoDoPreco = false;

		if (checkboxTarifa.isChecked()) {
			parametros.put("TARIFA", "true");
			composicaoDoPreco = true;
		}
		if (checkboxImportepedagio.isChecked()) {
			parametros.put("PEDAGIO", "true");
			composicaoDoPreco = true;
		}
		if (checkboxImportetaxaembarque.isChecked()) {
			parametros.put("TAXADEEMBARQUE", "true");
			composicaoDoPreco = true;
		}
		if (checkboxImporteseguro.isChecked()) {
			parametros.put("SEGURO", "true");
			composicaoDoPreco = true;
		}

		if (!composicaoDoPreco) {
			Messagebox.show(Labels.getLabel("relatorioVendasBilheteiroSinteticoController.erroSemComponenteDePreco"),
					Labels.getLabel("relatorioVendasBilheteiroSinteticoController.window.title"), Messagebox.OK,
					Messagebox.ERROR);
			return;
		}

		filtro.append("Agência: ");
		String puntoVentaIds = "";
		String puntoVentas = "";
		List<PuntoVenta> lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(puntoVentaSelList.getData()));
		if (lsPuntoVentaSelecionados.isEmpty()) {
			puntoVentas = "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);
			parametros.put("NUMPUNTOVENTA", puntoVentaIds);
		}
		filtro.append(puntoVentas).append(";");

		filtro.append("Usuarios: ");
		String usuarioIds = "";
		String usuarios = "";
		List<Usuario> lsUsuarioSelecionados = new ArrayList(Arrays.asList(usuarioSelList.getData()));
		if (lsUsuarioSelecionados.isEmpty()) {
			usuarios = "Todos";
		} else {
			for (int i = 0; i < lsUsuarioSelecionados.size(); i++) {
				Usuario usuario = lsUsuarioSelecionados.get(i);
				usuarios = usuarios + usuario.getClaveUsuario() + ",";

				usuarioIds = usuarioIds + usuario.getUsuarioId() + ",";
			}

			// removendo ultima virgula
			usuarioIds = usuarioIds.substring(0, usuarioIds.length() - 1);
			usuarios = usuarios.substring(0, usuarios.length() - 1);
			parametros.put("USUARIOIDS", usuarioIds);
		}
		filtro.append(usuarios).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("relatorioVendasBilheteiroSinteticoController.window.title"));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());

		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(" Canal Vendas: ");
		Comboitem itemTipoPuntoVenda = cmbTipoPuntoVenta.getSelectedItem();
		if (itemTipoPuntoVenda != null) {
			TipoPuntoVenta tpv = (TipoPuntoVenta) itemTipoPuntoVenda.getValue();
			parametros.put("TIPOPUNTOVENTA_ID", tpv.getTipoptovtaId());
			parametros.put("TIPOPUNTOVENTA", tpv.getDesctipo());
			filtro.append(tpv.getDesctipo() + ";");
		} else {
			filtro.append(" Todos;");
		}

		filtro.append(" Organização: ");

		if (radDigitacao.isChecked()) {
			filtro.append(radDigitacao.getLabel() + ";");
			parametros.put("ORGANIZADODIGITACAO", true);
		} else if (radFechamento.isChecked()) {
			filtro.append(radFechamento.getLabel() + ";");
			parametros.put("ORGANIZADOFECHAMENTO", true);
		} else {
			filtro.append(radBilheteiro.getLabel() + ";");
			parametros.put("ORGANIZADODIGITACAO", false);
			parametros.put("ORGANIZADOFECHAMENTO", false);
		}

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

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

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

	public MyListbox getPuntoVentaSelList() {
		return puntoVentaSelList;
	}

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

	public List<TipoPuntoVenta> getLsTipoPuntoVenta() {
		return lsTipoPuntoVenta;
	}

	public void setLsTipoPuntoVenta(List<TipoPuntoVenta> lsTipoPuntoVenta) {
		this.lsTipoPuntoVenta = lsTipoPuntoVenta;
	}

	public MyListbox getUsuarioList() {
		return usuarioList;
	}

	public void setUsuarioList(MyListbox usuarioList) {
		this.usuarioList = usuarioList;
	}

	public MyListbox getUsuarioSelList() {
		return usuarioSelList;
	}

	public void setUsuarioSelList(MyListbox usuarioSelList) {
		this.usuarioSelList = usuarioSelList;
	}

	public Radio getRadioDataVenda() {
		return radioDataVenda;
	}

	public void setRadioDataVenda(Radio radioDataVenda) {
		this.radioDataVenda = radioDataVenda;
	}

}
