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.Datebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.PerfilFuncion;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.entidad.UsuarioPerfil;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioPassagensAGER;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.UsuarioService;
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.RenderRelatorioLinhaHorario;

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

	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private UsuarioService usuarioService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;

	private Datebox datInicialVenda;
	private Datebox datFinalVenda;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbOrgaoConcedente;

	private List<Categoria> lsCategorias;
	private List<Empresa> lsEmpresas;
	private List<OrgaoConcedente> lsOrgaosConcedentes;

	private Textbox txtPalavraPesquisaLinha;
	private MyListbox linhaList;
	private MyListbox linhaListSelList;

	private static Logger log = LogManager.getLogger(RelatorioPassagensAGERController.class);

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();

		if (temPermissao("USUARIO.RELATORIO.AGER")) {
			lsOrgaosConcedentes = orgaoConcedenteService.buscar("AGER/MT");
			cmbOrgaoConcedente.setText(lsOrgaosConcedentes.isEmpty() ? "" : lsOrgaosConcedentes.get(0).getDescOrgao());

		} else {
			lsOrgaosConcedentes = orgaoConcedenteService.obtenerTodos();
			lsCategorias = categoriaService.obtenerTodos();
		}

		linhaList.setItemRenderer(new RenderRelatorioLinhaHorario());
		linhaListSelList.setItemRenderer(new RenderRelatorioLinhaHorario());
	}

	private void executarPesquisaLinha() {

		String palavraPesquisaRuta = txtPalavraPesquisaLinha.getText();

		if (temPermissao("USUARIO.RELATORIO.AGER")) {
			if (cmbOrgaoConcedente.getSelectedItem() == null) {
				return;
			}
			OrgaoConcedente orgaoConcedente = (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue();
			linhaList.setData(rutaService.buscaRuta(palavraPesquisaRuta, orgaoConcedente));
		} else {
			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 executarRelatorio() throws Exception {

		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 (cmbOrgaoConcedente.getSelectedIndex() == -1) {
			Messagebox.show(Labels.getLabel("relatorioPassagensAGERController.orgaoConcedente.obrigatorio"),
					Labels.getLabel("relatorioPassagensController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		if (parametros.get("fecInicioVenda") == null && parametros.get("datFinalVenda") == null) {
			Messagebox.show(Labels.getLabel("relatorioPassagensAGERController.data.obrigatoria"),
					Labels.getLabel("relatorioPassagensController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		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");
		}

		if (cmbOrgaoConcedente.getSelectedIndex() != -1) {
			parametros.put("orgaoConcedente", ((OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue()).getDescOrgao());
			parametros.put("CodOrgaoConcedente", ((OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue()).getOrgaoConcedenteId());
		}

		parametros.put("TITULO", Labels.getLabel("relatorioPassagensAGERController.window.title"));

		Relatorio relatorio = new RelatorioPassagensAGER(parametros, dataSourceRead.getConnection());

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

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

	}

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

	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());
	}

	private boolean temPermissao(String permissao) {
		Usuario usuario = usuarioService.obtenerID(UsuarioLogado.getUsuarioLogado().getUsuarioId());

		for (UsuarioPerfil up : usuario.getUsuarioPerfilList()) {
			List<PerfilFuncion> listPerfilFuncion = up.getPerfil().getPerfilFuncionList();
			for (PerfilFuncion pf : listPerfilFuncion) {
				if (pf.getFuncionSistema().getDescruta().equals(permissao)) {
					return true;
				}
			}
		}
		return false;
	}

	public List<Categoria> getLsCategorias() {
		return lsCategorias;
	}

	public void setLsCategorias(List<Categoria> lsCategorias) {
		this.lsCategorias = lsCategorias;
	}

	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 List<OrgaoConcedente> getLsOrgaosConcedentes() {
		return lsOrgaosConcedentes;
	}

	public void setLsOrgaosConcedentes(List<OrgaoConcedente> lsOrgaosConcedentes) {
		this.lsOrgaosConcedentes = lsOrgaosConcedentes;
	}

	public MyComboboxEstandar getCmbOrgaoConcedente() {
		return cmbOrgaoConcedente;
	}

	public void setCmbOrgaoConcedente(MyComboboxEstandar cmbOrgaoConcedente) {
		this.cmbOrgaoConcedente = cmbOrgaoConcedente;
	}
}
