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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
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.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ComboitemRenderer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;

import com.rjconsultores.ventaboletos.entidad.Corrida;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioOrigemDestino;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.CorridaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParadaCve;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioOrigemDestinoCorrida;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioOrigemDestinoCorridaSelecionadas;

@Controller("relatorioOrigemDestinoController")
@Scope("prototype")
public class RelatorioOrigemDestinoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private CorridaService corridaService;
	private List<Empresa> lsEmpresa;
	private Datebox datInicial;
	private Datebox datFinal;
	private Intbox txtCorridaId;
	private Intbox txtCodLinha;
	private MyListbox corridaList;
	private MyListbox corridaSelList;
	private Combobox cmbEmpresa;
	private Combobox cmbRuta;
	private Bandbox bbPesquisaCorrida;
	private Checkbox chkBilhetesGratuitos;
	private Checkbox chkTrechoSemMovimento;
	private List<Ruta> lsRuta;
	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParadaCve cmbParadaOrigemCve;
	private MyComboboxParada cmbParadaDestino;
	private MyComboboxParadaCve cmbParadaDestinoCve;

	public List<Ruta> getLsRuta() {
		return lsRuta;
	}

	public void setLsRuta(List<Ruta> lsRuta) {
		this.lsRuta = lsRuta;
	}

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

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

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

		corridaList.setItemRenderer(new RenderRelatorioOrigemDestinoCorrida());
		corridaSelList.setItemRenderer(new RenderRelatorioOrigemDestinoCorridaSelecionadas());

		cmbParadaOrigemCve.setItemRenderer(new ComboitemRenderer() {
			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Parada parada = (Parada) o;

				cmbtm.setLabel(parada.getCveparada());
				cmbtm.setValue(parada);
			}
		});

		cmbParadaDestinoCve.setItemRenderer(new ComboitemRenderer() {
			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Parada parada = (Parada) o;

				cmbtm.setLabel(parada.getCveparada());
				cmbtm.setValue(parada);
			}
		});
	}

	private void executarPesquisa() {
		Comboitem cbiOrigem = cmbParadaOrigem.getSelectedItem();
		Integer iorigem = null;
		if (cbiOrigem != null) {
			Parada origem = (Parada) cbiOrigem.getValue();
			iorigem = origem.getParadaId();
		}

		Comboitem cbiDestino = cmbParadaDestino.getSelectedItem();
		Integer idestino = null;
		if (cbiDestino != null) {
			Parada destino = (Parada) cbiDestino.getValue();
			idestino = destino.getParadaId();
		}

		Comboitem cbiRuta = cmbRuta.getSelectedItem();
		Integer iruta = null;
		if (cbiRuta != null) {
			Ruta ruta = (Ruta) cbiRuta.getValue();
			iruta = ruta.getRutaId();
		}

		Integer codLinha = txtCodLinha.getValue();

		Date dataDe = DateUtil.normalizar(datInicial.getValue());
		Date dataAte = DateUtil.normalizar(datFinal.getValue());

		Integer corridaId = txtCorridaId.getValue();
		List<Corrida> ls = corridaService.buscarGroupCorrridaId(corridaId, iorigem, idestino, iruta, codLinha, dataDe, dataAte);
		corridaList.setData(ls);

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

	public void onClick$btnLimpar(Event ev) {
		corridaList.setData(new ArrayList<Corrida>());

		bbPesquisaCorrida.setText("");
		cmbParadaOrigem.setText("");
		cmbParadaOrigemCve.setText("");
		cmbParadaDestino.setText("");
		cmbParadaDestinoCve.setText("");
		cmbRuta.setText("");

		cmbParadaOrigem.setSelectedItem(null);
		cmbParadaOrigemCve.setSelectedItem(null);
		cmbParadaDestino.setSelectedItem(null);
		cmbParadaDestinoCve.setSelectedItem(null);
		cmbRuta.setSelectedItem(null);

		txtCorridaId.setValue(null);
		txtCodLinha.setValue(null);
	}

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

	public void onDoubleClick$corridaSelList(Event ev) {
		Corrida corrida = (Corrida) corridaSelList.getSelected();
		corridaSelList.removeItem(corrida);
	}

	public void onDoubleClick$corridaList(Event ev) {
		Corrida corrida = (Corrida) corridaList.getSelected();
		corridaSelList.addItemNovo(corrida);
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		List<Corrida> lsCorridasSelecionadas = new ArrayList(Arrays.asList(corridaSelList.getData()));

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date dataDe = datInicial.getValue();
		Date dataAte = datFinal.getValue();

		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("BILHETES_GRATUITOS", chkBilhetesGratuitos.isChecked());
		parametros.put("TRECHOS_SEM_MOVIMENTO", chkTrechoSemMovimento.isChecked());
		parametros.put("DATA_DE", sdf.format(dataDe));
		parametros.put("DATA_ATE", sdf.format(dataAte));
		parametros.put("DATA_DE_WHERE", sdf.format(dataDe) + " 00:00:00");
		parametros.put("DATA_ATE_WHERE", sdf.format(dataAte) + " 23:59:59");

		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		String empresaId;
		String empresas;
		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();
			empresaId = empresa.getEmpresaId().toString();
			empresas = empresa.getNombempresa();
		} else {
			empresaId = "0";
			empresas = "";
			for (int i = 0; i < lsEmpresa.size(); i++) {
				Empresa empresa = lsEmpresa.get(i);
				empresaId = empresaId + ", " + empresa.getEmpresaId();
				empresas = empresas + ", " + empresa.getNombempresa();
			}
		}
		parametros.put("EMPRESA_IDS", empresaId);
		parametros.put("EMPRESAS", empresas);

		String corridaIds = "";
		if (!lsCorridasSelecionadas.isEmpty()) {
			for (int i = 0; i < lsCorridasSelecionadas.size(); i++) {
				Corrida corrida = lsCorridasSelecionadas.get(i);
				corridaIds = corridaIds + ", " + corrida.getId().getCorridaId();
			}
		} else {
			corridaIds = "TTodas";
		}
		parametros.put("CORRIDAS_SELECIONADAS", corridaIds.substring(1, corridaIds.length()));

		Relatorio relatorio = new RelatorioOrigemDestino(parametros, dataSourceRead.getConnection());

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

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

	public void onSelect$cmbParadaOrigemCve(Event ev) {
		if (cmbParadaOrigemCve.getSelectedItem() != null) {
			cmbParadaOrigem.setComboItemByParada((Parada) cmbParadaOrigemCve.getSelectedItem().getValue());
		}
	}

	public void onSelect$cmbParadaOrigem(Event ev) {
		if (cmbParadaOrigem.getSelectedItem() != null)
			cmbParadaOrigemCve.setComboItemByParada((Parada) cmbParadaOrigem.getSelectedItem().getValue());
	}

	public void onSelect$cmbParadaDestinoCve(Event ev) {
		if (cmbParadaDestinoCve.getSelectedItem() != null) {
			cmbParadaDestino.setComboItemByParada((Parada) cmbParadaDestinoCve.getSelectedItem().getValue());
		}
	}

	public void onSelect$cmbParadaDestino(Event ev) {
		if (cmbParadaDestino.getSelectedItem() != null) {
			cmbParadaDestinoCve.setComboItemByParada((Parada) cmbParadaDestino.getSelectedItem().getValue());
		}
	}
}
