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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
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.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioOperacionalFinanceiro;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TramoService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxMoeda;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioLinhaHorario;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTramoDesc;

@Controller("relatorioOperacionalFinanceiroController")
@Scope("prototype")
public class RelatorioOperacionalFinanceiroController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private TramoService tramoService;

	private Datebox datInicialVenda;
	private Datebox datFinalVenda;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxMoeda cmbMoeda;
	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParada cmbParadaDestino;

	private List<Empresa> lsEmpresas;

	private Textbox txtPalavraPesquisaLinha;
	
	private MyListbox linhaList;
	private MyListbox linhaListSelList;
	private MyListbox tramoList;
	private MyListbox tramoListSelList;
	
	private static Logger log = LogManager.getLogger(RelatorioOperacionalFinanceiroController.class);

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

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

		linhaList.setItemRenderer(new RenderRelatorioLinhaHorario());
		linhaListSelList.setItemRenderer(new RenderRelatorioLinhaHorario());
	}
	
	public void onDoubleClick$linhaList(Event ev) {
		linhaListSelList.addItemNovo(linhaList.getSelected());
	}

	public void onDoubleClick$tramoList(Event ev) {
		tramoListSelList.addItemNovo(tramoList.getSelected());
	}
	
	public void onClick$btnPesquisaTramo(Event ev) {
		executarPesquisaTramo();
	}

	public void onClick$btnLimparTramo(Event ev) {
		tramoList.clearSelection();
		tramoListSelList.setData(new ArrayList<Ruta>());

		tramoList.setItemRenderer(new RenderTramoDesc());
		tramoListSelList.setItemRenderer(new RenderTramoDesc());
	}

	private void executarPesquisaLinha() {

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

		if (linhaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioLinhasHorarioController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}
	
	private void executarPesquisaTramo() {

		if( cmbParadaOrigem.getSelectedItem() == null || cmbParadaDestino.getSelectedItem() == null ) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioOperacionalFinaceiroController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
			return;
		}
		
		Parada origem = (Parada)cmbParadaOrigem.getSelectedItem().getValue();
		Parada destino = (Parada)cmbParadaDestino.getSelectedItem().getValue();
		tramoList.setData( tramoService.obtenerListPorOrigemDestino(origem, destino) );

		if (tramoList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioOperacionalFinaceiroController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	private void executarRelatorio() throws Exception {

		log.info("EXECUTANDO RELATORIO OPERACION");
		Map<String, Object> parametros = new HashMap<String, Object>();

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		if (this.datInicialVenda.getValue() != null) {
			parametros.put("fecInicioVenda", sdf.format(this.datInicialVenda.getValue()));
		}

		if (this.datFinalVenda.getValue() != null) {
			parametros.put("fecFinalVenda", sdf.format(this.datFinalVenda.getValue()));
		}
 
		if (parametros.get("fecInicioVenda") == null && parametros.get("datFinalVenda") == null) {
			Messagebox.show(Labels.getLabel("relatorioOperacionalFinanceiroController.data.obrigatoria"),
					Labels.getLabel("relatorioGratuidadeController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		StringBuilder tramo = new StringBuilder();
		StringBuilder tramoIds = new StringBuilder();
		
		if (tramoListSelList.getListData().isEmpty()) {	
			tramo.append("Todas");
			tramoIds.append("Todas");
		}else {
			for (Object obj : tramoListSelList.getListData()) {
				Tramo tramos = (Tramo) obj;
				tramo.append(tramos.getDesctramo()).append(",");
				tramoIds.append(tramos.getTramoId()).append(",");
			}
	
			// removendo ultima virgula
			tramoIds = tramoIds.delete(tramoIds.length() - 1, tramoIds.length());
			tramo = tramo.delete(tramo.length() - 1, tramo.length());

		}
		
		parametros.put("tramos", tramo.append(";").toString());
		parametros.put("tramoIds", tramoIds.toString());
			
		StringBuilder linhas = new StringBuilder();
		StringBuilder linhaIds = new StringBuilder();

		if (linhaListSelList.getListData().isEmpty()) {
			linhas.append("Todas");
			linhaIds.append("Todas");
		} else {
			for (Object obj : linhaListSelList.getListData()) {
				Ruta ruta = (Ruta) obj;
				linhas.append(ruta.getDescruta()).append(",");
				linhaIds.append(ruta.getRutaId()).append(",");
			}

			// removendo ultima virgula
			linhaIds = linhaIds.delete(linhaIds.length() - 1, linhaIds.length());
			linhas = linhas.delete(linhas.length() - 1, linhas.length());
		}

		parametros.put("linhas", linhas.append(";").toString());
		parametros.put("linhaIds", linhaIds.toString());

		if (cmbEmpresa.getSelectedIndex() != -1) {
			parametros.put("empresa", ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getEmpresaId());
			parametros.put("nomb_empresa", ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getNombempresa());
		} else {
			parametros.put("nomb_empresa", "Todas");
		}		
		
		Comboitem itemMoeda = cmbMoeda.getSelectedItem();
		if (itemMoeda != null ) {
			Moneda moeda = (Moneda) itemMoeda.getValue();
			parametros.put("MOEDA_ID", moeda.getMonedaId());
			parametros.put("MOEDA_SIMBOLO", moeda.getSimbolo());
			parametros.put("descMoeda", moeda.getDescmoneda());
		}

		parametros.put("TITULO", Labels.getLabel("relatorioOpe"
				+ "racionalFinanceiroController.window.title"));

		Relatorio relatorio = new RelatorioOperacionalFinanceiro(parametros, dataSourceRead.getConnection());
		
		log.info("RELATORIO == NULL ? = " + relatorio == null);

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

		log.info("ANTES DE ABRIR A TELA DO RELATORIO");
		openWindow("/component/reportView.zul",
				Labels.getLabel("relatorioOperacionalFinanceiroController.window.title"), args, MODAL);

	}

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

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

		linhaList.setItemRenderer(new RenderRelatorioLinhaHorario());
		linhaListSelList.setItemRenderer(new RenderRelatorioLinhaHorario());
		
		tramoList.setItemRenderer(new RenderTramoDesc());
		tramoListSelList.setItemRenderer(new RenderTramoDesc());
	}

	public Datebox getDatInicialVenda() {
		return datInicialVenda;
	}

	public void setDatInicialVenda(Datebox datInicialVenda) {
		this.datInicialVenda = datInicialVenda;
	}

	public Datebox getDatFinalVenda() {
		return datFinalVenda;
	}

	public void setDatFinalVenda(Datebox datFinalVenda) {
		this.datFinalVenda = datFinalVenda;
	}

	public MyListbox getLinhaListSelList() {
		return linhaListSelList;
	}

	public void setLinhaListSelList(MyListbox linhaListSelList) {
		this.linhaListSelList = linhaListSelList;
	}

	public Textbox getTxtPalavraPesquisaLinha() {
		return txtPalavraPesquisaLinha;
	}

	public void setTxtPalavraPesquisaLinha(Textbox txtPalavraPesquisaLinha) {
		this.txtPalavraPesquisaLinha = txtPalavraPesquisaLinha;
	}

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

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

	public MyComboboxParada getCmbParadaOrigem() {
		return cmbParadaOrigem;
	}

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

	public MyComboboxParada getCmbParadaDestino() {
		return cmbParadaDestino;
	}

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