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

import java.text.SimpleDateFormat;
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.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Datebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioCheckinAberto;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioEncerramentoCheckin;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.web.utilerias.MensagensUtils;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

//Mantis 15199

@Controller("relatorioEncerramentoCheckinController")
@Scope("prototype")
@SuppressWarnings("serial")
public class RelatorioCheckinEnacerramentoAbertoController extends MyGenericForwardComposer {

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private EmpresaService empresaService;

	private Datebox dataInicioServico;
	private Datebox dataFimServico;
	private Datebox dataInicioEncerramento;
	private Datebox dataFimEncerramento;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxParada cmbLocalidade;
	private List<Empresa> lsEmpresas;
	private Checkbox chcEncerrado;
	private Checkbox chcAberto;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresas = empresaService.obtenerTodos();
		chcEncerrado.setChecked(Boolean.TRUE);
	}
	
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}

	private void executarRelatorio() throws Exception {
		Map<String, Object> parametros = new HashMap<String, Object>();

		// Datas
		putParametrosDate(parametros, RelatorioEncerramentoCheckin.DATA_INICIO_SERVICO, this.dataInicioServico.getValue());
		putParametrosDate(parametros, RelatorioEncerramentoCheckin.DATA_FIM_SERVICO, this.dataFimServico.getValue());
		putParametrosDate(parametros, RelatorioEncerramentoCheckin.DATA_INICIO_ENCERRAMENTO, this.dataInicioEncerramento.getValue());
		putParametrosDate(parametros, RelatorioEncerramentoCheckin.DATA_FIM_ENCERRAMENTO, this.dataFimEncerramento.getValue());

		// validação datas
		if (parametros.containsKey(RelatorioEncerramentoCheckin.DATA_INICIO_SERVICO) && !parametros.containsKey(RelatorioEncerramentoCheckin.DATA_FIM_SERVICO) || !parametros.containsKey(RelatorioEncerramentoCheckin.DATA_INICIO_SERVICO) && parametros.containsKey(RelatorioEncerramentoCheckin.DATA_FIM_SERVICO)) {
			MensagensUtils.showMessageInformation(Labels.getLabel("relatorioEncerramentoCheckinController.data.servico.obrigatoria"), Labels.getLabel("relatorioEncerramentoCheckinController.window.title"));
			return;
		}
				
		if (parametros.containsKey(RelatorioEncerramentoCheckin.DATA_INICIO_ENCERRAMENTO) && !parametros.containsKey(RelatorioEncerramentoCheckin.DATA_FIM_ENCERRAMENTO) || !parametros.containsKey(RelatorioEncerramentoCheckin.DATA_INICIO_ENCERRAMENTO) && parametros.containsKey(RelatorioEncerramentoCheckin.DATA_FIM_ENCERRAMENTO)) {
			MensagensUtils.showMessageInformation(Labels.getLabel("relatorioEncerramentoCheckinController.data.encerramento.obrigatoria"), Labels.getLabel("relatorioEncerramentoCheckinController.window.title"));
			return;
		}
		
		if (!parametros.containsKey(RelatorioEncerramentoCheckin.DATA_INICIO_SERVICO) && !parametros.containsKey(RelatorioEncerramentoCheckin.DATA_FIM_SERVICO) && !parametros.containsKey(RelatorioEncerramentoCheckin.DATA_INICIO_ENCERRAMENTO) && !parametros.containsKey(RelatorioEncerramentoCheckin.DATA_FIM_ENCERRAMENTO)) {
			MensagensUtils.showMessageInformation(Labels.getLabel("relatorioEncerramentoCheckinController.data.obrigatoria"), Labels.getLabel("relatorioEncerramentoCheckinController.window.title"));
			return;
		}

		// Empresa
		if (cmbEmpresa.getSelectedIndex() != -1) {
			Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
			parametros.put("empresa_id", empresa.getEmpresaId());
			parametros.put("EMPRESA", empresa.getNombempresa());
		} else {
			parametros.put("EMPRESA", "TODAS");
		}
		
		// Localidade
		if (cmbLocalidade.getSelectedIndex() != -1) {
			parametros.put("localidade_id", ((Parada) cmbLocalidade.getSelectedItem().getValue()).getParadaId());
		}

		Relatorio relatorio = null;
		if(chcEncerrado.isChecked()) {
			parametros.put("TITULO", Labels.getLabel("relatorioEncerramentoCheckinController.window.title"));
			relatorio = new RelatorioEncerramentoCheckin(parametros, dataSourceRead.getConnection());
		}else {
			parametros.put("TITULO", Labels.getLabel("relatorioCheckinAbertoController.window.title"));
			relatorio = new RelatorioCheckinAberto(parametros, dataSourceRead.getConnection());
		}
		

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

		if(chcEncerrado.isChecked()) {
			openWindow("/component/reportView.zul", Labels.getLabel("relatorioEncerramentoCheckinController.window.title"), args, MODAL);			
		}else {
			openWindow("/component/reportView.zul", Labels.getLabel("relatorioCheckinAbertoController.window.title"), args, MODAL);
		}
		
	}

	private void putParametrosDate(Map<String, Object> parametros, String nomeParametro, Date data) {
		if (data != null) {
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			parametros.put(nomeParametro, sdf.format(data));
		}
	}

	// gets/sets
	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

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