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

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.Filedownload;
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.Ruta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RelatorioAgepanService;
import com.rjconsultores.ventaboletos.service.RutaService;
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("relatorioGratuidadeAGEPANController")
@Scope("prototype")
public class RelatorioGratuidadeAGEPANController extends MyGenericForwardComposer {
	
	private static Logger log = LogManager.getLogger(RelatorioGratuidadeAGEPANController.class);
	
	private static final long serialVersionUID = 1L;

	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private RelatorioAgepanService relatorioAgepanService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;

	private Datebox datInicialVenda;
	private Datebox datFinalVenda;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbTipoGratuidade;

	private List<Categoria> lsCategorias;
	private List<Empresa> lsEmpresas;
	
	private Textbox txtPalavraPesquisaLinha;
	private MyListbox linhaList;
	private MyListbox linhaListSelList;
	private MyListbox selectedTipoGratuidadeList;
	
	private List<Categoria> listSelectedTipoGratuidade;	
	
	private Integer orgaoConcendenteAgepan =null;
	
	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();
		linhaList.setData(rutaService.buscaRuta(palavraPesquisaRuta));

		if (linhaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioGratuidadeAGEPANController.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 (parametros.get("fecInicioVenda") == null && parametros.get("datFinalVenda") == null) {
			 Messagebox.show(Labels.getLabel("relatorioGratuidadeAGEPANController.data.obrigatoria"),
                     Labels.getLabel("relatorioGratuidadeAGEPANController.window.title"),
                     Messagebox.OK, Messagebox.INFORMATION);
			 return;
		}
		
		if (listSelectedTipoGratuidade.isEmpty()) {
			 Messagebox.show(Labels.getLabel("relatorioGratuidadeAGEPANController.tipo.obrigatoria"),
                    Labels.getLabel("relatorioGratuidadeAGEPANController.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" );
		}
		
		parametros.put("orgaoConcendenteAgepanId", orgaoConcendenteAgepan );
		
		
		try {
			InputStream arquivo = relatorioAgepanService.gerarArquivoGratuidadeAgepan(parametros);
			
			Filedownload.save(arquivo, "application/xls", "gratuidadeAGEPAN.xls");
		} catch (BusinessException e) {
			log.error(e.getMessage(), e);
			Messagebox.show(e.getMessage(),
							Labels.getLabel("relatorioGratuidadeAGEPANController.window.title"),
							Messagebox.OK, Messagebox.ERROR);			
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			Messagebox.show(Labels.getLabel("MSG.Error").concat(" - ").concat(e.toString()),
							Labels.getLabel("relatorioGratuidadeAGEPANController.window.title"),
							Messagebox.OK, Messagebox.ERROR);			
		}
		
	}

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

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		List<OrgaoConcedente> lsOrgaosConcedentes = orgaoConcedenteService.buscar("%AGEPAN%");
		if (lsOrgaosConcedentes.isEmpty()) {
			Messagebox.show(Labels.getLabel("MSG.Error").concat(" - ").concat("Orgão Concendente AGEPAN Não cadastrado"),
					Labels.getLabel("relatorioGratuidadeAGEPANController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		} else {
			orgaoConcendenteAgepan = lsOrgaosConcedentes.get(0).getOrgaoConcedenteId();
			lsEmpresas = empresaService.obtenerTodos();
			lsCategorias = categoriaService.obtenerTodos();
			listSelectedTipoGratuidade = new ArrayList<Categoria>();

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

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

}
