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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

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.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.Empresa;
import com.rjconsultores.ventaboletos.entidad.Pacote;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.TipoTarifaPacote;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasPacotesDetalhado;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.PacoteService;
import com.rjconsultores.ventaboletos.service.TipoTarifaPacoteService;
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.MyComboboxUsuario;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("relatorioVendasPacotesDetalhadoController")
@Scope("prototype")
public class RelatorioVendasPacotesDetalhadoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private DataSource dataSourceRead;
	
	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private PacoteService pacoteService;
	
	@Autowired
	private TipoTarifaPacoteService tipoTarifaPacoteService;

	private List<Empresa> lsEmpresa;
	private List<Pacote> lsPacote;
	private List<TipoTarifaPacote> lsTipoTarifaPacote;
	private Datebox dataInicial;
	private Datebox dataFinal;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbPacote;
	private MyComboboxEstandar cmbTipoTarifaPacote;
	
	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParadaCve cmbParadaOrigemCve;
	private MyComboboxParada cmbParadaDestino;
	private MyComboboxParadaCve cmbParadaDestinoCve;
	private MyComboboxUsuario cmbUsuario;

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

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

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = new ArrayList<Empresa>();
		lsEmpresa.add(new Empresa(-1, "TODAS"));
		lsEmpresa.addAll(empresaService.obtenerTodos());
		
		lsPacote = new ArrayList<Pacote>();
		lsPacote.add(new Pacote(-1, "TODOS"));
		lsPacote.addAll(pacoteService.obtenerTodos());
		
		lsTipoTarifaPacote = new ArrayList<TipoTarifaPacote>();
		lsTipoTarifaPacote.add(new TipoTarifaPacote(-1, "TODAS"));
		lsTipoTarifaPacote.addAll(tipoTarifaPacoteService.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);
			}
		});
		
		cmbUsuario.setItemRenderer(new ComboitemRenderer() {
			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Usuario usuario = (Usuario) o;
				
				cmbtm.setLabel(usuario.getNombusuario());
				cmbtm.setValue(usuario);
			}
		});
		
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date dataDe = dataInicial.getValue();
		Date dataAte = dataFinal.getValue();

		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("fecInicio", sdf.format(dataDe));
		parametros.put("fecFinal", sdf.format(dataAte));

		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		String empresaId = null;
		parametros.put("empresa", "TODAS");
		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();
			empresaId = empresa.getEmpresaId().toString();
			parametros.put("empresa", empresa.getNombempresa());
		}
		parametros.put("empresaId", empresaId);
		
		Comboitem cbiPacote = cmbPacote.getSelectedItem();
		String pacoteId = null;
		parametros.put("nompacote", "TODOS");
		if (cbiPacote != null) {
			Pacote pacote = (Pacote) cbiPacote.getValue();
			pacoteId = pacote.getPacoteId().toString();
			parametros.put("nompacote", pacote.getNompacote());
		}
		parametros.put("pacoteId", pacoteId);
		
		parametros.put("origem","Todas");
		Comboitem cbiOrigem = cmbParadaOrigem.getSelectedItem();
		if (cbiOrigem != null) {
			Parada origem = (Parada) cbiOrigem.getValue();
			parametros.put("origenId", origem.getParadaId());
			parametros.put("origem", origem.getDescparada());
		}

		parametros.put("destino","Todos");
		Comboitem cbiDestino = cmbParadaDestino.getSelectedItem();
		if (cbiDestino != null) {
			Parada destino = (Parada) cbiDestino.getValue();
			parametros.put("destinoId", destino.getParadaId());
			parametros.put("destino", destino.getDescparada());
		}

		parametros.put("usuario","Todos");
		Comboitem cbiUsuario = cmbUsuario.getSelectedItem();
		if (cbiUsuario != null) {
			Usuario usuario = (Usuario) cbiUsuario.getValue();
			parametros.put("usuarioId", usuario.getUsuarioId());
			parametros.put("usuario", usuario.getNombUsuarioCompleto());
		}
		
		parametros.put("tipoTarifaPacote","Todas");
		Comboitem cbiTipoTarifaPacote = cmbTipoTarifaPacote.getSelectedItem();
		if (cbiTipoTarifaPacote != null) {
			TipoTarifaPacote tipoTarifaPacote = (TipoTarifaPacote) cbiTipoTarifaPacote.getValue();
			parametros.put("tipoTarifaPacoteId", tipoTarifaPacote.getTipotarifapacoteId());
			parametros.put("tipoTarifaPacote", tipoTarifaPacote.getDesctipotarifa());
		}

		JasperReport subRelatorioVendasPacotesDetalhadoItens = (JasperReport) JRLoader.loadObject(this.getClass().getResourceAsStream("/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasPacotesDetalhadoItem.jasper"));
		parametros.put("subreporte", subRelatorioVendasPacotesDetalhadoItens);

		Relatorio relatorio = new RelatorioVendasPacotesDetalhado(parametros, dataSourceRead.getConnection(), "RelatorioVendasPacotesDetalhadoItem");
		
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

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

	public List<Pacote> getLsPacote() {
		return lsPacote;
	}

	public void setLsPacote(List<Pacote> lsPacote) {
		this.lsPacote = lsPacote;
	}

	public List<TipoTarifaPacote> getLsTipoTarifaPacote() {
		return lsTipoTarifaPacote;
	}

	public void setLsTipoTarifaPacote(List<TipoTarifaPacote> lsTipoTarifaPacote) {
		this.lsTipoTarifaPacote = lsTipoTarifaPacote;
	}

}
