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

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.apache.logging.log4j.LogManager;
import org.apache.logging.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.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioMmphDer;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.ValidarDatas;
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;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioAproveitamentoFinanceiro;


@Controller("relatorioMmphDerController")
@Scope("prototype")
@SuppressWarnings({ "rawtypes", "unchecked" })
public class RelatorioMmphDerController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(RelatorioMmphDerController.class);
	private static final String TITULO_EXPORTACAO = Labels.getLabel("relatorioLinhasHorarioController.window.title");

	@Autowired
	private DataSource dataSourceRead;

	private Datebox datInicial;
	private Datebox datFinal;

	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;

	@Autowired
	private RutaService rutaService;

	private MyListbox linhaList;
	private MyListbox linhaListSelList;
	private Textbox txtPalavraPesquisaLinha;
	private ArrayList<Ruta> lsNumLinha = new ArrayList<Ruta>();

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		linhaList.setItemRenderer(new RenderRelatorioAproveitamentoFinanceiro());
		linhaListSelList.setItemRenderer(new RenderRelatorioAproveitamentoFinanceiro());
	}

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

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

	public void onDoubleClick$linhaList(Event ev) {
		Ruta rutaAux = (Ruta) linhaList.getSelected();
		linhaListSelList.addItemNovo(rutaAux);
	}

	private void executarPesquisaLinha() {

		String palavraPesquisaRuta = txtPalavraPesquisaLinha.getText();
		linhaList.setData(rutaService.buscaRuta(palavraPesquisaRuta));

		if (linhaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						TITULO_EXPORTACAO,
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				log.error(ex);
			}
		}
	}

	public void onClick$btnPesquisaLinha(Event ev) {
		executarPesquisaLinha();
	}

	public void onClick$btnLimparLinha(Event ev) {
		linhaList.setData(new ArrayList<Ruta>());
		linhaList.clearSelection();
		lsNumLinha.clear();
	}

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

	private void executarRelatorio() throws Exception {
		Relatorio relatorio;
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();
		
		Date dataDe = this.datInicial.getValue();
		Date dataAte = this.datFinal.getValue();
		
		ValidarDatas validarDatas = new ValidarDatas(datInicial, datFinal);
		
		if (!validarDatas.isMesmoMes()) {
			Messagebox.show(
                    Labels.getLabel("relatorioMmphDerController.MSG.mesDiferente"),
                    TITULO_EXPORTACAO,
                    Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		
		validarDatas.validarDataInicioMaiorQueTermino(
				Labels.getLabel("relatorioMmphDerController.MSG.dataInicialMaiorFinal")
				, TITULO_EXPORTACAO);

		filtro.append("Linha: ");
		String linhaIds = "";
		String linhas = "";
		List<Ruta> lslinhaSelecionados = new ArrayList(Arrays.asList(linhaListSelList.getData()));
		if (lslinhaSelecionados.isEmpty()) {
			linhas = "Todas";
		} else {
			for (int i = 0; i < lslinhaSelecionados.size(); i++) {
				Ruta linha = lslinhaSelecionados.get(i);
				linhas = linhas + linha.getDescruta() + ", ";

				linhaIds = linhaIds + linha.getRutaId() + ", ";
			}

			// removendo ultima virgula
			linhaIds = linhaIds.substring(0, linhaIds.length() - 2);
			linhas = linhas.substring(0, linhas.length() - 2);
			parametros.put("LINHAS", linhaIds);
		}
		filtro.append(linhas).append(";");
		
		parametros.put("DATA_INICIAL", dataDe);
		parametros.put("DATA_FINAL", dataAte);
		parametros.put("NOME_RELATORIO", TITULO_EXPORTACAO);
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario());

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

		parametros.put("FILTROS", filtro.toString());
		relatorio = new RelatorioMmphDer(parametros, dataSourceRead.getConnection());

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

		openWindow("/component/reportView.zul",	TITULO_EXPORTACAO, args, MODAL);
	}
}
