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

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

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.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Radiogroup;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.enums.TypeEventListener;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.eventos.EventListenerBtnLimparPesquisa;
import com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.eventos.EventListenerValidarInclusaoListBox;
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.render.RenderRutaPersonalizado;

@Controller("relatorioPosicaoVendaBilheteIdosoController")
@Scope("prototype")
public class RelatorioPosicaoVendaBilheteIdosoController extends MyGenericForwardComposer {
	
	public static final String TITULO_RELATORIO = "indexController.mniRelatorioPosicaoVendaBilheteIdoso.label";
	public static final Integer LISTAR_TODAS = -1;

	private static final long serialVersionUID = 1L;

	private Datebox dtInicial;
	private Datebox dtFinal;
	private Radiogroup tipoData;
	private Radiogroup tipoRelatorio;

	@Autowired
	private EmpresaService empresaService;
	private List<Empresa> lsEmpresa;
	private Combobox cmbEmpresa;

	private MyListbox linhaList;
	private MyListbox linhaSelList;
	private MyTextbox txtPalavraPesquisaLinha;

	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	private List<OrgaoConcedente> lsOrgaoConcedente;
	private Combobox cmbOrgaoConcedente;
	
	private MyListbox tpPassagemList;
	private MyListbox tpPassagemSelList;
	private MyTextbox txtPalavraPesquisaTpPassagem;
	private Button  btnPesquisaLinha;
	private Button  btnLimparLinha;
	private Button  btnPesquisaTpPassagem;
	private Button  btnLimparTpPassagem;
	private Button  btnExecutarRelatorio;
	
	@Autowired
	private DataSource dataSource;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		lsOrgaoConcedente = orgaoConcedenteService.obtenerTodosExceto(-1);
		super.doAfterCompose(comp);
		configuraRenders();
		configuraEventosComboOrgaoConcedente();
		configuraEventosPesquisaLinha();
		configuraEventosPesquisaTipoPassagem();
		configuraEventosExecucaoRelatorio();
	}

	private void configuraRenders() {
		List<String> colunasLinhaRender = Arrays.asList("numRuta", "prefixo", "descruta");
		linhaList.setItemRenderer(new RenderRutaPersonalizado(colunasLinhaRender));
		linhaSelList.setItemRenderer(new RenderRutaPersonalizado(colunasLinhaRender).comBotaoExcluir());
		tpPassagemList.setItemRenderer(new RenderCategoria());
		tpPassagemSelList.setItemRenderer(new RenderCategoria().comBotaoExcluir());
	}
	
	private void configuraEventosComboOrgaoConcedente() {
		cmbOrgaoConcedente.addEventListener(TypeEventListener.ON_CTRL_KEY.getEvent(), 
				new EventListenerOnCtrlKeyComboOrgao());
		cmbOrgaoConcedente.addEventListener(TypeEventListener.ON_CHANGE.getEvent(), 
				new EventListenerOnChangeComboOrgao());
	}

	private void configuraEventosPesquisaLinha() {
		btnPesquisaLinha.addEventListener(TypeEventListener.ON_CLICK.getEvent(),
				new EventListenerBtnPesquisarLinha("rutaService", linhaList,
						txtPalavraPesquisaLinha, this));
		btnLimparLinha.addEventListener(TypeEventListener.ON_CLICK.getEvent(),
				new EventListenerBtnLimparPesquisa(getLinhaList(), txtPalavraPesquisaLinha));
		linhaSelList.addEventListener(TypeEventListener.ON_DOUBLE_CLICK.getEvent(),
				new EventListenerRemoverItemListBox<Ruta>(linhaSelList));
		linhaList.addEventListener(TypeEventListener.ON_DOUBLE_CLICK.getEvent(),
				new EventListenerValidarInclusaoListBox<Ruta>(linhaSelList, linhaList));
	}

	private void configuraEventosPesquisaTipoPassagem() {
		btnPesquisaTpPassagem.addEventListener(TypeEventListener.ON_CLICK.getEvent(),
				new EventListenerBtnPesquisarTipoPassagem("categoriaService", tpPassagemList, txtPalavraPesquisaTpPassagem, TITULO_RELATORIO));
		btnLimparTpPassagem.addEventListener(TypeEventListener.ON_CLICK.getEvent(),
				new EventListenerBtnLimparPesquisa(tpPassagemList, txtPalavraPesquisaTpPassagem));
		tpPassagemSelList.addEventListener(TypeEventListener.ON_DOUBLE_CLICK.getEvent(),
				new EventListenerRemoverItemListBox<Categoria>(tpPassagemSelList));
		tpPassagemList.addEventListener(TypeEventListener.ON_DOUBLE_CLICK.getEvent(),
				new EventListenerValidarInclusaoListBox<Ruta>(tpPassagemSelList, tpPassagemList));
	}

	private void configuraEventosExecucaoRelatorio() {
		btnExecutarRelatorio.addEventListener(TypeEventListener.ON_CLICK.getEvent(), 
				new EventListenerExecutarRelatorioVendaBilheteIdoso(this));
	}

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

	public List<OrgaoConcedente> getLsOrgaoConcedente() {
		return lsOrgaoConcedente;
	}
	
	public Empresa getEmpresaSelecionada() {
		return cmbEmpresa.getSelectedItem() != null 
				? (Empresa) cmbEmpresa.getSelectedItem().getValue() : null;
	}

	private void limparValoresLinhasSelecionadas(Event ev) throws Exception {
		(new EventListenerBtnLimparPesquisa(linhaList, txtPalavraPesquisaTpPassagem)).onEvent(ev);
		linhaSelList.setData(new ArrayList<Ruta>());
	}

	public Datebox getDtInicial() {
		return dtInicial;
	}

	public Datebox getDtFinal() {
		return dtFinal;
	}
	
	public Boolean possuiLinhaSelecionada() {
		return linhaSelList.getSize() > 0;
	}
	
	public Boolean possuiTipoPassagemSelecionado() {
		return tpPassagemSelList.getSize() > 0;
	}

	public MyListbox getLinhaList() {
		return linhaList;
	}

	public Radiogroup getTipoData() {
		return tipoData;
	}
	
	public Radiogroup getTipoRelatorio() {
		return tipoRelatorio;
	}

	public EmpresaService getEmpresaService() {
		return empresaService;
	}

	public MyListbox getLinhaSelList() {
		return linhaSelList;
	}

	public MyTextbox getTxtPalavraPesquisaLinha() {
		return txtPalavraPesquisaLinha;
	}

	public OrgaoConcedenteService getOrgaoConcedenteService() {
		return orgaoConcedenteService;
	}

	public MyListbox getTpPassagemList() {
		return tpPassagemList;
	}

	public MyListbox getTpPassagemSelList() {
		return tpPassagemSelList;
	}

	public MyTextbox getTxtPalavraPesquisaTpPassagem() {
		return txtPalavraPesquisaTpPassagem;
	}

	public Button getBtnPesquisaLinha() {
		return btnPesquisaLinha;
	}

	public Button getBtnLimparLinha() {
		return btnLimparLinha;
	}

	public DataSource getDataSource() {
		return dataSource;
	}
	
	public Combobox getCmbOrgaoConcedente() {
		return cmbOrgaoConcedente;
	}
	
	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	private final class EventListenerOnChangeComboOrgao implements EventListener {
		@Override
		public void onEvent(Event ev) throws Exception {
			limparValoresLinhasSelecionadas(ev);				
		}
	}

	private final class EventListenerOnCtrlKeyComboOrgao implements EventListener {
		@Override
		public void onEvent(Event ev) throws Exception {
			((MyComboboxEstandar) cmbOrgaoConcedente).setSelectedItem(null);
			((MyComboboxEstandar) cmbOrgaoConcedente).close();
			limparValoresLinhasSelecionadas(ev);
		}
	}
}
