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.Comboitem;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioTabelaPreco;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TarifaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
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.RenderLinhaRelatorioTabelaPreco;

@Controller("relatorioTabelaPrecoController")
@Scope("prototype")
public class RelatorioTabelaPrecoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private MyComboboxEstandar cmbVigencia;
	private List<VigenciaTarifa> lsVigencia;
	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;
	private MyComboboxEstandar cmbOrgaoConcedente;
	private List<OrgaoConcedente> lsOrcaoConcedente;
	@Autowired
	private transient PagedListWrapper<Ruta> plwRuta;

	private Paging pagingLinha;
	private MyTextbox txtLinha;
	private MyListbox linhaList;
	private MyListbox linhaSelList;

	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private OrgaoConcedenteService orgaocConcedenteService;
	@Autowired
	private TarifaService tarifaService;

	@Autowired
	private DataSource dataSourceRead;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsVigencia = vigenciaTarifaService.obtenerTodos();
		lsEmpresa = empresaService.obtenerTodos();
		lsOrcaoConcedente = orgaocConcedenteService.obtenerTodos();
		super.doAfterCompose(comp);
		linhaList.setItemRenderer(new RenderLinhaRelatorioTabelaPreco());
		linhaSelList.setItemRenderer(new RenderLinhaRelatorioTabelaPreco());
	}

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

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

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

			Comboitem itemVigencia = cmbVigencia.getSelectedItem();
			if (itemVigencia != null) {
				VigenciaTarifa vigencia = (VigenciaTarifa) itemVigencia.getValue();
				parametros.put("VIGENCIA_ID", vigencia.getVigenciatarifaId());
				parametros.put("VIGENCIA_INICIAL", vigencia.getFeciniciovigencia());
				parametros.put("VIGENCIA_FINAL", vigencia.getFecfinvigencia());
			}

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

			String rutaIds = "";
			String rutas = "";
			List<Ruta> lsLinhasSelecionadas = new ArrayList(Arrays.asList(linhaSelList.getData()));
			if (lsLinhasSelecionadas.isEmpty()) {
				rutas = "Todas";
			} else {
				for (int i = 0; i < lsLinhasSelecionadas.size(); i++) {
					Ruta ruta = lsLinhasSelecionadas.get(i);
					rutas += ruta.getDescruta() + ", ";
					rutaIds += ruta.getRutaId() + ",";
				}
				// removendo ultima virgula
				rutaIds = rutaIds.substring(0, rutaIds.length() - 1);
				rutas = rutas.substring(0, rutas.length() - 2);
				parametros.put("LINHAS_ID", rutaIds);
			}

			parametros.put("LINHAS", rutas);
			relatorio = new RelatorioTabelaPreco(parametros, dataSourceRead.getConnection());

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

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

	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		List<Ruta> lsLinhasSelecionadas = new ArrayList(Arrays.asList(linhaSelList.getData()));
		if (lsLinhasSelecionadas.isEmpty()) {
			Messagebox.show(Labels.getLabel("relatorioTabelaPrecoController.msg.informarLinha"),
					Labels.getLabel("relatorioTabelaPrecoController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		if (cmbVigencia.getValue() != null
				&& cmbEmpresa.getValue() != null) {
			executarRelatorio();
		}
	}

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

	public void onClick$btnLimpar(Event ev) {
		linhaList.setData(new ArrayList<Ruta>());
		txtLinha.setText("");
	}

	public void onDoubleClick$linhaSelList(Event ev) {
		Ruta linha = (Ruta) linhaSelList.getSelected();
		linhaSelList.removeItem(linha);
	}

	public void onDoubleClick$linhaList(Event ev) {
		Ruta ruta = (Ruta) linhaList.getSelected();
		linhaSelList.addItemNovo(ruta);
	}

	private void executarPesquisa() {
		HibernateSearchObject<Ruta> rutaBusqueda =
				new HibernateSearchObject<Ruta>(Ruta.class, pagingLinha.getPageSize());

		rutaBusqueda.addFilterILike("descruta", "%" + txtLinha.getValue() + "%");
		rutaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		plwRuta.init(rutaBusqueda, linhaList, pagingLinha);

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

	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 MyComboboxEstandar getCmbVigencia() {
		return cmbVigencia;
	}

	public void setCmbVigencia(MyComboboxEstandar cmbVigencia) {
		this.cmbVigencia = cmbVigencia;
	}

	public List<VigenciaTarifa> getLsVigencia() {
		return lsVigencia;
	}

	public void setLsVigencia(List<VigenciaTarifa> lsVigencia) {
		this.lsVigencia = lsVigencia;
	}

	public MyComboboxEstandar getCmbOrgaoConcedente() {
		return cmbOrgaoConcedente;
	}

	public void setCmbOrgaoConcedente(MyComboboxEstandar cmbOrgaoConcedente) {
		this.cmbOrgaoConcedente = cmbOrgaoConcedente;
	}

	public List<OrgaoConcedente> getLsOrcaoConcedente() {
		return lsOrcaoConcedente;
	}

	public void setLsOrcaoConcedente(List<OrgaoConcedente> lsOrcaoConcedente) {
		this.lsOrcaoConcedente = lsOrcaoConcedente;
	}

}
