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

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

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.Cliente;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioGratuidadeAGR;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioGratuidadeAGRCliente;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.RutaService;
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.RenderClienteSimples;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioLinhaHorario;
import com.trg.search.Filter;

@Controller("relatorioGratuidadeAGRController")
@Scope("prototype")
public class RelatorioGratuidadeAGRController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private RutaService rutaService;	
	@Autowired
	private transient PagedListWrapper<Cliente> plwCliente;
	
	private MyTextbox txtCliente;	
	private Paging pagingCliente;	
	private MyListbox clienteList;	
	private MyListbox clienteSelList;

	private Datebox datInicialVenda;
	private Datebox datFinalVenda;
	private Datebox datInicialViagem;
	private Datebox datFinalViagem;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbTipoGratuidade;
	private Radiogroup rgLayout;

	private List<Categoria> lsCategorias;
	private List<Empresa> lsEmpresas;
	
	private Textbox txtPalavraPesquisaLinha;
	private MyListbox linhaList;
	private MyListbox linhaListSelList;
	private MyListbox selectedTipoGratuidadeList;
	
	private List<Categoria> listSelectedTipoGratuidade;	
	
	public void onClick$btnRemoveTipoGratuidade(Event ev) throws InterruptedException {
		Categoria categoria = (Categoria) selectedTipoGratuidadeList.getSelectedItem().getValue();
		listSelectedTipoGratuidade.remove(categoria);
		selectedTipoGratuidadeList.setData(listSelectedTipoGratuidade);
	}

	public void onClick$btnAddTipoTipoGratuidade(Event ev) throws InterruptedException {
		if (cmbTipoGratuidade.getSelectedItem() != null) {
			listSelectedTipoGratuidade.add((Categoria) cmbTipoGratuidade.getSelectedItem().getValue());
			selectedTipoGratuidadeList.setData(listSelectedTipoGratuidade);
			selectedTipoGratuidadeList.setSelectedItem(null);
		}
	}
	
	public void onClick$btnPesquisaLinha(Event ev) {
		executarPesquisaLinha();
	}

	public void onClick$btnLimparLinha(Event ev) {
		linhaList.clearSelection();
		linhaListSelList.setData(new ArrayList<Ruta>());
		
		linhaList.setItemRenderer(new RenderRelatorioLinhaHorario());
		linhaListSelList.setItemRenderer(new RenderRelatorioLinhaHorario());
	}
	
	public void onDoubleClick$linhaList(Event ev) {
		linhaListSelList.addItemNovo(linhaList.getSelected());
	}
	
	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) {
			}
		}
	}

	private void executarRelatorio() throws Exception {

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

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		if (this.datInicialVenda.getValue() != null) {
			parametros.put("fecInicioVenda", sdf.format(this.datInicialVenda.getValue()));
		}
		
		if (this.datFinalVenda.getValue() != null) {
			parametros.put("fecFinalVenda", sdf.format(this.datFinalVenda.getValue()));
		}
		
		if (this.datInicialViagem.getValue() != null) {
			parametros.put("fecInicioViagem", sdf.format(this.datInicialViagem.getValue()));
		}
		
		if (this.datFinalViagem.getValue() != null) {
			parametros.put("fecFinalViagem", sdf.format(this.datFinalViagem.getValue()));
		}
		
		if ( (parametros.get("fecInicioVenda") == null && parametros.get("fecFinalVenda") == null) &&
				(parametros.get("fecInicioViagem") == null && parametros.get("fecFinalViagem") == null)) {
			 Messagebox.show(Labels.getLabel("relatorioGratuidadeAGRController.data.obrigatoria"),
                     Labels.getLabel("relatorioGratuidadeController.window.title"),
                     Messagebox.OK, Messagebox.INFORMATION);
			 return;
		}
		
		StringBuilder tipGratu = new StringBuilder();
		StringBuilder tipGratuIds = new StringBuilder();
		if (selectedTipoGratuidadeList.getListData().isEmpty()) {
			tipGratu.append("Todas;");
			tipGratuIds.append("Todas;");
		} else {
			for (Categoria categoria : listSelectedTipoGratuidade) {		
				tipGratu.append(categoria.getDesccategoria()).append(",");
				tipGratuIds.append(categoria.getCategoriaId()).append(",");
			}
		}

		// removendo ultima virgula
		tipGratuIds = tipGratuIds.delete(tipGratuIds.length() -1, tipGratuIds.length());
		tipGratu = tipGratu.delete(tipGratu.length() -1, tipGratu.length());

		parametros.put("tipGratu", tipGratu.append(";").toString());
		parametros.put("tipGratuIds", tipGratuIds.toString());

		StringBuilder linhas = new StringBuilder();
		StringBuilder linhaIds = new StringBuilder();
		
		if (linhaListSelList.getListData().isEmpty()) {
			linhas.append("Todas");
			linhaIds.append("Todas");
		} else {
			for (Object obj : linhaListSelList.getListData()) {
				Ruta ruta = (Ruta)obj;
				linhas.append(ruta.getDescruta()).append(",");
				linhaIds.append(ruta.getRutaId()).append(",");
			}

			// removendo ultima virgula
			linhaIds = linhaIds.delete(linhaIds.length() -1, linhaIds.length());
			linhas = linhas.delete(linhas.length() -1, linhas.length());
		}

		parametros.put("linhas", linhas.append(";").toString());
		parametros.put("linhaIds", linhaIds.toString());
		
		StringBuilder clientes = new StringBuilder();
		StringBuilder clienteIds = new StringBuilder();
		
		if (clienteSelList.getListData().isEmpty()) {
			clientes.append("Todas");
			clienteIds.append("Todas");
		} else {
			for (Object obj : clienteSelList.getListData()) {
				Cliente cliente = (Cliente)obj;
				clientes.append(cliente.getNumIdentificaUno()).append(",");
				clienteIds.append(cliente.getClienteId()).append(",");
			}

			// removendo ultima virgula
			clienteIds = clienteIds.delete(clienteIds.length() -1, clienteIds.length());
			clientes = clientes.delete(clientes.length() -1, clientes.length());
		}

		parametros.put("clientes", clientes.append(";").toString());
		parametros.put("clienteIds", clienteIds.toString());
		
		if (cmbEmpresa.getSelectedIndex() != -1) {
			parametros.put("empresa", ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getEmpresaId());
			parametros.put("nomb_empresa", ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getNombempresa());

		}else{
			parametros.put("nomb_empresa", "Todas" );
		}
		
		Relatorio relatorio;
		
		if(rgLayout.getSelectedItem().getValue().equals("GERAL")) {
			relatorio = new RelatorioGratuidadeAGR(parametros, dataSourceRead.getConnection());			
		}else {
			relatorio = new RelatorioGratuidadeAGRCliente(parametros, dataSourceRead.getConnection());	
		}
		
		parametros.put("TITULO", Labels.getLabel("relatorioGratuidadeAGRController.window.title"));

		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

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

	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}
	
	private void executarPesquisaCliente() {
		HibernateSearchObject<Cliente> clienteBusqueda =
				new HibernateSearchObject<Cliente>(Cliente.class, pagingCliente.getPageSize());
		if(txtCliente.getValue() != null && !txtCliente.getValue().equals("") ){
			Filter filterNome = new Filter("nombcliente", txtCliente.getValue() + "%", Filter.OP_ILIKE);
			Filter filterCpf = new Filter("numIdentificaUno", txtCliente.getValue() + "%", Filter.OP_ILIKE);
			Filter filterCpf2 = new Filter("numIdentificaDos", txtCliente.getValue() + "%", Filter.OP_ILIKE);
			
			clienteBusqueda.addFilterOr( filterNome, filterCpf, filterCpf2 );
			clienteBusqueda.addFilterEqual("activo", Boolean.TRUE);
			clienteBusqueda.addSortAsc("nombcliente");
			
		}						
		plwCliente.init(clienteBusqueda, clienteList, pagingCliente);		
		if (clienteList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
					  Labels.getLabel("carteirinhaController.window.title"), 
					  Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}

	public void onClick$btnPesquisaCliente(Event ev) {
		executarPesquisaCliente();
	}
	
	public void onDoubleClick$clienteList(Event ev) {
		Cliente cliente = (Cliente) clienteList.getSelected();
		clienteSelList.addItemNovo(cliente);
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresas = empresaService.obtenerTodos();
		lsCategorias = categoriaService.obtenerTodos();
		listSelectedTipoGratuidade = new ArrayList<Categoria>();
		
		linhaList.setItemRenderer(new RenderRelatorioLinhaHorario());
		linhaListSelList.setItemRenderer(new RenderRelatorioLinhaHorario());
		
		clienteList.setItemRenderer(new RenderClienteSimples());
		clienteSelList.setItemRenderer(new RenderClienteSimples());
	}

	public List<Categoria> getLsCategorias() {
		return lsCategorias;
	}

	public void setLsCategorias(List<Categoria> lsCategorias) {
		this.lsCategorias = lsCategorias;
	}

	public Datebox getDatInicialVenda() {
		return datInicialVenda;
	}

	public void setDatInicialVenda(Datebox datInicialVenda) {
		this.datInicialVenda = datInicialVenda;
	}

	public Datebox getDatFinalVenda() {
		return datFinalVenda;
	}

	public void setDatFinalVenda(Datebox datFinalVenda) {
		this.datFinalVenda = datFinalVenda;
	}

	public MyComboboxEstandar getCmbTipoGratuidade() {
		return cmbTipoGratuidade;
	}

	public void setCmbTipoGratuidade(MyComboboxEstandar cmbTipoGratuidade) {
		this.cmbTipoGratuidade = cmbTipoGratuidade;
	}

	public MyListbox getLinhaListSelList() {
		return linhaListSelList;
	}

	public void setLinhaListSelList(MyListbox linhaListSelList) {
		this.linhaListSelList = linhaListSelList;
	}

	public Textbox getTxtPalavraPesquisaLinha() {
		return txtPalavraPesquisaLinha;
	}

	public void setTxtPalavraPesquisaLinha(Textbox txtPalavraPesquisaLinha) {
		this.txtPalavraPesquisaLinha = txtPalavraPesquisaLinha;
	}
	
	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public Datebox getDatInicialViagem() {
		return datInicialViagem;
	}

	public void setDatInicialViagem(Datebox datInicialViagem) {
		this.datInicialViagem = datInicialViagem;
	}

	public Datebox getDatFinalViagem() {
		return datFinalViagem;
	}

	public void setDatFinalViagem(Datebox datFinalViagem) {
		this.datFinalViagem = datFinalViagem;
	}

	public Radiogroup getRgLayout() {
		return rgLayout;
	}

	public void setRgLayout(Radiogroup rgLayout) {
		this.rgLayout = rgLayout;
	}
	
	public Paging getPagingCliente() {
		return pagingCliente;
	}

	public void setPagingCliente(Paging pagingCliente) {
		this.pagingCliente = pagingCliente;
	}
	
	public MyListbox getSelectedTipoGratuidadeList() {
		return selectedTipoGratuidadeList;
	}

	public void setSelectedTipoGratuidadeList(MyListbox selectedTipoGratuidadeList) {
		this.selectedTipoGratuidadeList = selectedTipoGratuidadeList;
	}

	public List<Categoria> getListSelectedTipoGratuidade() {
		return listSelectedTipoGratuidade;
	}

	public void setListSelectedTipoGratuidade(List<Categoria> listSelectedTipoGratuidade) {
		this.listSelectedTipoGratuidade = listSelectedTipoGratuidade;
	}

}
