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.RelatorioGratuidadeAGER;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
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("relatorioGratuidadeAGERController")
@Scope("prototype")
public class RelatorioGratuidadeAGERController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private EmpresaService empresaService;
	@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 MyComboboxEstandar cmbTipoGratuidade;

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

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

	private List<Categoria> listSelectedTipoGratuidade;
	private static Logger log = LogManager.getLogger(RelatorioGratuidadeAGERController.class);

	public void onClick$btnRemoveTipoGratuidade(Event ev) throws InterruptedException {
		Categoria categoria = (Categoria) selectedTipoGratuidadeList.getSelectedItem().getValue();
		listSelectedTipoGratuidade.remove(categoria);
		selectedTipoGratuidadeList.setData(listSelectedTipoGratuidade);
	}

	public void onClick$btnAddTipoTipoGratuidade(Event ev) throws InterruptedException {
		if (cmbTipoGratuidade.getSelectedItem() != null) {
			listSelectedTipoGratuidade.add((Categoria) cmbTipoGratuidade.getSelectedItem().getValue());
			selectedTipoGratuidadeList.setData(listSelectedTipoGratuidade);
			selectedTipoGratuidadeList.setSelectedItem(null);
		}
	}

	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 MyListbox getSelectedTipoGratuidadeList() {
		return selectedTipoGratuidadeList;
	}

	public void setSelectedTipoGratuidadeList(MyListbox selectedTipoGratuidadeList) {
		this.selectedTipoGratuidadeList = selectedTipoGratuidadeList;
	}

	public List<Categoria> getListSelectedTipoGratuidade() {
		return listSelectedTipoGratuidade;
	}

	public void setListSelectedTipoGratuidade(List<Categoria> listSelectedTipoGratuidade) {
		this.listSelectedTipoGratuidade = listSelectedTipoGratuidade;
	}

	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 {

		log.info("EXECUTANDO RELATORIO AGER");
		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("relatorioGratuidadeAGERController.orgaoConcedente.obrigatorio"),
					Labels.getLabel("relatorioGratuidadeController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

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

		if (listSelectedTipoGratuidade.isEmpty()) {
			Messagebox.show(Labels.getLabel("relatorioGratuidadeAGERController.tipo.obrigatoria"),
					Labels.getLabel("relatorioGratuidadeController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		StringBuilder tipGratu = new StringBuilder();
		StringBuilder tipGratuIds = new StringBuilder();
		for (Categoria categoria : listSelectedTipoGratuidade) {
			tipGratu.append(categoria.getDesccategoria()).append(",");
			tipGratuIds.append(categoria.getCategoriaId()).append(",");
		}

		// removendo ultima virgula
		tipGratuIds = tipGratuIds.delete(tipGratuIds.length() - 1, tipGratuIds.length());
		tipGratu = tipGratu.delete(tipGratu.length() - 1, tipGratu.length());

		parametros.put("tipGratu", tipGratu.append(";").toString());
		parametros.put("tipGratuIds", tipGratuIds.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");
		}
		
		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("relatorioGratuidadeAGERController.window.title"));

		Relatorio relatorio = new RelatorioGratuidadeAGER(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("relatorioGratuidadeAGERController.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();
		
		if (temPermissao("USUARIO.RELATORIO.AGER")){
			lsOrgaosConcedentes = orgaoConcedenteService.buscar("AGER/MT");
			cmbOrgaoConcedente.setText(lsOrgaosConcedentes.isEmpty() ? "": lsOrgaosConcedentes.get(0).getDescOrgao());
						
			lsCategorias = categoriaService.buscar("NORMAL");
			cmbTipoGratuidade.setText(lsCategorias.isEmpty() ? "": lsCategorias.get(0).getDesccategoria());
			
		}else {
			lsOrgaosConcedentes = orgaoConcedenteService.obtenerTodos();
			lsCategorias = categoriaService.obtenerTodos();			
		}
		
		listSelectedTipoGratuidade = new ArrayList<Categoria>();
		linhaList.setItemRenderer(new RenderRelatorioLinhaHorario());
		linhaListSelList.setItemRenderer(new RenderRelatorioLinhaHorario());
	}
	
	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 MyComboboxEstandar getCmbTipoGratuidade() {
		return cmbTipoGratuidade;
	}

	public void setCmbTipoGratuidade(MyComboboxEstandar cmbTipoGratuidade) {
		this.cmbTipoGratuidade = cmbTipoGratuidade;
	}

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