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

import java.util.Calendar;
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.ComboitemRenderer;
import org.zkoss.zul.Datebox;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioReceitaServico;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
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.MyTextbox;

@Controller("relatorioReceitaServicoController")
@Scope("prototype")
public class RelatorioReceitaServicoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private Datebox datInicial;
	private Datebox datFinal;
	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParadaCve cmbParadaOrigemCve;
	private MyComboboxParada cmbParadaDestino;
	private MyComboboxParadaCve cmbParadaDestinoCve;
	private List<Empresa> lsEmpresa;
	private List<ClaseServicio> lsClase;
	private MyTextbox txtCorridaId;

	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbClase;

	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private ClaseServicioService claseService;
	@Autowired
	private DataSource dataSourceRead;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		lsClase = claseService.obtenerTodos();

		super.doAfterCompose(comp);
		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);
			}
		});

	}

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

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

		if (datInicial != null && datFinal != null && datFinal.getValue().compareTo(datInicial.getValue()) < 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioReceitaServicoController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		} else
		{
			Relatorio relatorio;

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

			StringBuilder filtro = new StringBuilder();

			if (null != txtCorridaId.getValue() && !("".equals(txtCorridaId.getValue())))
			{
				filtro.append("Serviço: ");
				filtro.append(txtCorridaId.getValue() + "; ");
				parametros.put("CORRIDA_ID", txtCorridaId.getValue());
			} else {
				filtro.append("Serviço: TODOS; ");
				parametros.put("CORRIDA_ID", null);
			}

			filtro.append("Início período: ");
			Calendar cal = Calendar.getInstance();
			cal.setTime(datInicial.getValue());
			filtro.append(cal.get(Calendar.DATE) + "/");
			filtro.append((cal.get(Calendar.MONTH) + 1) + "/");
			filtro.append(cal.get(Calendar.YEAR) + "; ");

			filtro.append("Fim período: ");
			cal.setTime(datFinal.getValue());
			filtro.append(cal.get(Calendar.DATE) + "/");
			filtro.append((cal.get(Calendar.MONTH) + 1) + "/");
			filtro.append(cal.get(Calendar.YEAR) + "; ");

			parametros.put("DATA_INICIAL", (java.util.Date) datInicial.getValue());
			parametros.put("DATA_FINAL", (java.util.Date) datFinal.getValue());

			Comboitem cbiOrigem = cmbParadaOrigem.getSelectedItem();
			if (cbiOrigem != null) {
				Parada origem = (Parada) cbiOrigem.getValue();
				if (origem.getParadaId() != -1) {
					parametros.put("ORIGEN_ID", origem.getParadaId());
					filtro.append("Origem: " + origem.getCveparada() + "; ");
				}
				else {
					parametros.put("ORIGEN_ID", null);
					filtro.append("Origem: Todas; ");
				}
			} else {
				parametros.put("ORIGEN_ID", null);
				filtro.append("Origem: Todas; ");
			}

			Comboitem cbiDestino = cmbParadaDestino.getSelectedItem();
			if (cbiDestino != null) {
				Parada destino = (Parada) cbiDestino.getValue();
				if (destino.getParadaId() != -1)
				{
					parametros.put("DESTINO_ID", destino.getParadaId());
					filtro.append("Destino: " + destino.getCveparada() + "; ");
				} else {
					parametros.put("DESTINO_ID", null);
					filtro.append("Destino: Todos; ");
				}

			} else {
				parametros.put("DESTINO_ID", null);
				filtro.append("Destino: Todos; ");
			}

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

			Comboitem itemClasse = cmbClase.getSelectedItem();
			if (itemClasse != null) {
				ClaseServicio clase = (ClaseServicio) itemClasse.getValue();
				if (clase.getClaseservicioId() == -1) {
					parametros.put("CLASESERVICIO_ID", "");
					filtro.append("Classe: " + clase.getDescclase() + "; ");
				}
				else {
					parametros.put("CLASESERVICIO_ID", clase.getClaseservicioId());
				}
				filtro.append("Classe: " + clase.getDescclase() + "; ");
			} else {
				parametros.put("CLASESERVICIO_ID", "");
				filtro.append("Classe: TODAS; ");
			}

			parametros.put("FILTROS", filtro.toString());

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

			relatorio = new RelatorioReceitaServico(parametros, dataSourceRead.getConnection());

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

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

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

	public Datebox getDatInicial() {
		return datInicial;
	}

	public void setDatInicial(Datebox datInicial) {
		this.datInicial = datInicial;
	}

	public Datebox getDatFinal() {
		return datFinal;
	}

	public void setDatFinal(Datebox datFinal) {
		this.datFinal = datFinal;
	}

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

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

	public EmpresaService getEmpresaService() {
		return empresaService;
	}

	public void setEmpresaService(EmpresaService empresaService) {
		this.empresaService = empresaService;
	}

	public List<ClaseServicio> getLsClase() {
		return lsClase;
	}

	public void setLsClase(List<ClaseServicio> lsClase) {
		this.lsClase = lsClase;
	}

	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(MyComboboxEstandar cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public ClaseServicioService getClaseService() {
		return claseService;
	}

	public void setClaseService(ClaseServicioService claseService) {
		this.claseService = claseService;
	}

	public MyComboboxEstandar getCmbClase() {
		return cmbClase;
	}

	public void setCmbClase(MyComboboxEstandar cmbClase) {
		this.cmbClase = cmbClase;
	}

	public MyComboboxParada getCmbParadaOrigem() {
		return cmbParadaOrigem;
	}

	public void setCmbParadaOrigem(MyComboboxParada cmbParadaOrigem) {
		this.cmbParadaOrigem = cmbParadaOrigem;
	}

	public MyComboboxParadaCve getCmbParadaOrigemCve() {
		return cmbParadaOrigemCve;
	}

	public void setCmbParadaOrigemCve(MyComboboxParadaCve cmbParadaOrigemCve) {
		this.cmbParadaOrigemCve = cmbParadaOrigemCve;
	}

	public MyComboboxParada getCmbParadaDestino() {
		return cmbParadaDestino;
	}

	public void setCmbParadaDestino(MyComboboxParada cmbParadaDestino) {
		this.cmbParadaDestino = cmbParadaDestino;
	}

	public MyComboboxParadaCve getCmbParadaDestinoCve() {
		return cmbParadaDestinoCve;
	}

	public void setCmbParadaDestinoCve(MyComboboxParadaCve cmbParadaDestinoCve) {
		this.cmbParadaDestinoCve = cmbParadaDestinoCve;
	}

	public MyTextbox getTxtCorridaId() {
		return txtCorridaId;
	}

	public void setTxtCorridaId(MyTextbox txtCorridaId) {
		this.txtCorridaId = txtCorridaId;
	}

}
