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

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

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.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ComboitemRenderer;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.TaxaEmbarqueParadaService;
import com.rjconsultores.ventaboletos.vo.esquemaoperacional.TaxaEmbarqueW2i;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParadaCve;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEstoqueTaxaDeEmbarqueW2i;

@Controller("estoqueTaxaEmbarqueW2iController")
@Scope("prototype")
public class EstoqueTaxaEmbarqueW2iController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(EstoqueTaxaEmbarqueW2iController.class);
	
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private TaxaEmbarqueParadaService taxaEmbarqueService;

	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParadaCve cmbParadaOrigemCve;

	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;
	
	private Combobox cmbOrgaoConcedente;
	private List<OrgaoConcedente> lsOrgaosConcedentes;
	
	private Combobox cmbCategorias;
	private List<Categoria> lsCategorias;
	
	private MyListbox estoqueList;
	
	private MyTextbox txtKm;
	
	private List<TaxaEmbarqueW2i> listaEstoque = new ArrayList<TaxaEmbarqueW2i>();

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		lsCategorias = categoriaService.obtenerTodos();
		super.doAfterCompose(comp);
		
		estoqueList.setItemRenderer(new RenderEstoqueTaxaDeEmbarqueW2i());

		cmbParadaOrigemCve.setItemRenderer(new ComboitemRenderer() {

			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Parada parada = (Parada) o;

				cmbtm.setLabel(parada.getCveparada());
				cmbtm.setValue(parada);
			}
		});
		
		lsOrgaosConcedentes = orgaoConcedenteService.obtenerTodos();
	}
	
	public void onSelect$cmbParadaOrigemCve(Event ev) {
		if (cmbParadaOrigemCve.getSelectedItem() != null) {
			cmbParadaOrigem.setComboItemByParada((Parada) cmbParadaOrigemCve.getSelectedItem().getValue());
		}
	}
	
	public void onSelect$cmbParadaOrigem(Event ev) {
		if (cmbParadaOrigem.getSelectedItem() != null) {
			cmbParadaOrigemCve.setComboItemByParada((Parada) cmbParadaOrigem.getSelectedItem().getValue());
		}
	}
	
	public void onClick$btnPesquisa(Event ev) {
		try {
			listaEstoque = new ArrayList<TaxaEmbarqueW2i>();
			Connection conexao = dataSourceRead.getConnection();
			
			Parada origem = null;
			Comboitem cbiOrigem = cmbParadaOrigem.getSelectedItem();
			if (cbiOrigem != null) {
				origem = (Parada) cbiOrigem.getValue();
			}
			
			Empresa empresa = null;
			Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
			if (itemEmpresa != null) {
				empresa = (Empresa) itemEmpresa.getValue();
			}
			
			if(origem == null) {
				Messagebox.show(Labels.getLabel("filtroTaxaEmbarqueW2i.MSG.informarDatas"), 
						Labels.getLabel("filtroTaxaEmbarqueW2i.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
				return;
			}
			
			OrgaoConcedente orgao = cmbOrgaoConcedente.getSelectedItem() != null ? (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue() : null;
			
			Categoria categoria = cmbCategorias.getSelectedItem() != null ? (Categoria) cmbCategorias.getSelectedItem().getValue() : null;
			
			listaEstoque = taxaEmbarqueService.buscarEstoqueTaxaEmbarque(origem, empresa, txtKm.getValue(), orgao, categoria);
			
			estoqueList.setData(listaEstoque);
			
			if(estoqueList.getData().length == 0) {
				Messagebox.show(Labels.getLabel("filtroTaxaEmbarqueW2i.MSG.NaoExisteConfiguracao"), 
						Labels.getLabel("filtroTaxaEmbarqueW2i.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
		} catch (Exception e) {
			try {
				Messagebox.show(Labels.getLabel("filtroTaxaEmbarqueW2i.MSG.erroPesquisa"), 
						Labels.getLabel("filtroTaxaEmbarqueW2i.window.title"),
						Messagebox.OK, Messagebox.ERROR);
			} catch (InterruptedException e1) {
				
			}
			log.error("Erro ao buscar taxa de embarque", e);
		}
	}

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

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

	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(MyComboboxEstandar cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public List<OrgaoConcedente> getLsOrgaosConcedentes() {
		return lsOrgaosConcedentes;
	}

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

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

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

	public MyListbox getEstoqueList() {
		return estoqueList;
	}

	public void setEstoqueList(MyListbox estoqueList) {
		this.estoqueList = estoqueList;
	}
}
