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

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

import javax.sql.DataSource;

import org.apache.log4j.Logger;
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.zkplus.databind.BindingListModel;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Timebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDemandasDetalhado;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

/**
 * @author Thiago
 *
 */
@Controller("relatorioDemandasController")
@Scope("prototype")
public class RelatorioDemandasController extends MyGenericForwardComposer {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(RelatorioDemandasController.class);

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private RutaService rutaService;

	@Autowired
	private ParadaService paradaService;

	private Datebox datInicial;
	private Datebox datFinal;

	private Timebox horaInicial;
	private Timebox horaFinal;

	private Radio todos;
	private Radio normal;
	private Radio extra;

	private Radio detalhado;
	private Radio diario;
	private Radio consolidado;

	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;

	private MyComboboxEstandar cmbLinha;
	private List<Ruta> lsLinha;

	private MyComboboxEstandar cmbOrigem;
	private List<Parada> lsOrigem;

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

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

	public List<Ruta> getLsLinha() {
		return lsLinha;
	}

	public void setLsLinha(List<Ruta> lsLinha) {
		this.lsLinha = lsLinha;
	}

	public List<Parada> getLsOrigem() {
		return lsOrigem;
	}

	public void setLsOrigem(List<Parada> lsOrigem) {
		this.lsOrigem = lsOrigem;
	}

	public void onChange$cmbEmpresa(Event ev) throws Exception {
		if (cmbEmpresa != null) {
			Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
			if (itemEmpresa != null) {
				Empresa empresa = (Empresa) itemEmpresa.getValue();
				lsLinha = rutaService.obtenerPorEmpresa(empresa);
				BindingListModel listLinhaModel = new BindingListModelList(lsLinha, true);
				cmbLinha.setValue("");
				cmbLinha.setModel(listLinhaModel);
			}
		}
	}

	public void onChange$cmbLinha(Event ev) throws Exception {
		if (cmbLinha != null) {
			Comboitem itemEmpresa = cmbLinha.getSelectedItem();
			if (itemEmpresa != null) {
				Ruta linha = (Ruta) itemEmpresa.getValue();
				// mudar depois
				lsOrigem = paradaService.obtenerOrigenPorRuta(linha);

				BindingListModel listOrigemModel = new BindingListModelList(lsOrigem, true);
				cmbOrigem.setValue("");
				cmbOrigem.setModel(listOrigemModel);
			}
		}
	}

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

	}

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

	/**
	 * @throws Exception
	 * 
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		Relatorio relatorio;
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();

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

		filtro.append("Linha: ");
		Comboitem itemLinha = cmbLinha.getSelectedItem();
		if (itemLinha != null) {
			Ruta linha = (Ruta) itemLinha.getValue();
			parametros.put("RUTA_ID", linha.getRutaId());
			parametros.put("RUTA", linha.getDescruta());
			filtro.append(linha.getDescruta() + ";");
		} else {
			filtro.append(" Todas;");
		}

		filtro.append("Origem: ");
		Comboitem itemOrigem = cmbOrigem.getSelectedItem();
		if (itemOrigem != null) {
			Parada origem = (Parada) itemOrigem.getValue();
			parametros.put("PARADA_ID", origem.getParadaId());
			parametros.put("PARADA", origem.getDescparada());
			filtro.append(origem.getDescparada() + ";");
		} else {
			filtro.append(" Todas;");
		}
		
		
		Calendar dataFinal = Calendar.getInstance();
		dataFinal.setTime((Date) this.datFinal.getValue());
		
		
		parametros.put("DATA_INICIAL", (Date) this.datInicial.getValue());
		parametros.put("DATA_FINAL", (Date) this.datFinal.getValue());
		parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioDemandasController.window.title"));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		

		filtro.append("Tipo de Serviço: ");
		if (!todos.isChecked()) {
			if (normal.isChecked()) {
				parametros.put("TIPO_SERVICO", Integer.valueOf(normal.getValue()));
				filtro.append(" Normal;");
			} else {
				parametros.put("TIPO_SERVICO", Integer.valueOf(extra.getValue()));
				filtro.append(" Extra;");
			}
		} else {
			filtro.append(" Todos;");
		}
		
		SimpleDateFormat formatDate = new SimpleDateFormat("hh:mm");
		filtro.append("Hora de Saída: ");
		
		if(horaInicial.getValue()!= null){
			filtro.append("De ");
			filtro.append(formatDate.format(horaInicial.getValue()) );
			parametros.put("HORA_INICIAL", horaInicial.getValue());
		}
		if(horaFinal.getValue()!= null){
			filtro.append(" à ");
			filtro.append(formatDate.format(horaFinal.getValue()));
			parametros.put("HORA_FINAL", horaFinal.getValue());
		}
		
		if(horaInicial.getValue()== null && horaFinal.getValue()== null){
			filtro.append(" Todos;");
		}
		parametros.put("FILTROS", filtro.toString());
		
		
		if (detalhado.isChecked()) {
			relatorio = new RelatorioDemandasDetalhado(parametros, dataSourceRead.getConnection());
		} else if (diario.isChecked()) {
			relatorio = new RelatorioDemandasDiario(parametros, dataSourceRead.getConnection());
		} else {
			relatorio = new RelatorioDemandasConsolidado(parametros, dataSourceRead.getConnection());
		}

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

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

}
