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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

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.Checkbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioTabelaPreco;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.SegVKMService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
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.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderLinhaRelatorioTabelaPreco;

@Controller("relatorioTabelaPrecoController")
@Scope("prototype")
public class RelatorioTabelaPrecoController extends MyGenericForwardComposer {

	private static final String TITULO = "relatorioTabelaPrecoController.window.title";

	private static final long serialVersionUID = 1L;

	private MyComboboxEstandar cmbVigencia;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbOrgaoConcedente;
	private MyComboboxParada cmbOrigem;
	private MyComboboxEstandar cmbDestino;
	private Checkbox chkLayoutArtesp;

	private Paging pagingLinha;
	private MyTextbox txtLinha;
	private MyListbox linhaList;
	private MyListbox linhaSelList;

	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private OrgaoConcedenteService orgaocConcedenteService;
	@Autowired
	private transient PagedListWrapper<Ruta> plwRuta;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private SegVKMService segVKMService;
	@Autowired
	private MarcaService marcaService;

	private List<Parada> destinoList;
	private List<VigenciaTarifa> lsVigencia;
	private List<Empresa> lsEmpresa;
	private List<OrgaoConcedente> lsOrcaoConcedente;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsVigencia = vigenciaTarifaService.obtenerTodos();
		lsEmpresa = empresaService.obtenerTodos();
		lsOrcaoConcedente = orgaocConcedenteService.obtenerTodos();
		super.doAfterCompose(comp);
		linhaList.setItemRenderer(new RenderLinhaRelatorioTabelaPreco());
		linhaSelList.setItemRenderer(new RenderLinhaRelatorioTabelaPreco());
	}

	@SuppressWarnings("unchecked")
	private <T> List<T> convertTypedList(Object[] array) {
		return (List<T>) Arrays.asList(array);
	}

	private void executarRelatorio() throws Exception {
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();	

		parametros.put("NOME_RELATORIO", Labels.getLabel(TITULO));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		parametros.put("USUARIO_NOME", UsuarioLogado.getUsuarioLogado().getNombusuario());

		Comboitem itemVigencia = cmbVigencia.getSelectedItem();
		filtro.append("Vigencia: ");
		if (itemVigencia != null) {
			
			VigenciaTarifa vigencia = (VigenciaTarifa) itemVigencia.getValue();
			parametros.put("VIGENCIA_ID", vigencia.getVigenciatarifaId());
			parametros.put("VIGENCIA_INICIAL", vigencia.getFeciniciovigencia());
			parametros.put("VIGENCIA_FINAL", vigencia.getFecfinvigencia());
			
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			filtro.append( sdf.format(vigencia.getFeciniciovigencia()) );
			filtro.append( " à " );
			filtro.append( sdf.format(vigencia.getFecfinvigencia()) );
		}else {
			filtro.append(" Todas;");
		}

		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		filtro.append(" Empresa: ");
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			parametros.put("EMPRESA_ID", empresa.getEmpresaId());
			parametros.put("EMPRESA", empresa.getNombempresa());
			parametros.put("MARCA",marcaService.buscarMarcaPorEmpresa(Arrays.asList(empresa)).get(0));
			
			filtro.append(empresa.getNombempresa() + ";");
		}else {
			filtro.append(" Todas;");
		}

		filtro.append(" Orgão Concedente: ");
		if (cmbOrgaoConcedente.getSelectedItem() != null) {
			OrgaoConcedente orgaoConcedente = (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue();
			parametros.put("ORGAO_CONCEDENTE_ID", orgaoConcedente.getOrgaoConcedenteId());
			parametros.put("ORGAO_CONCEDENTE", orgaoConcedente.getDescOrgao());
			
			filtro.append(orgaoConcedente.getDescOrgao() + ";");
		}else {
			filtro.append(" Todos;");
		}

		filtro.append(" Origem: ");
		if (cmbOrigem.getSelectedItem() != null) {
			parametros.put("origemId", cmbOrigem.getSelectedObject().getParadaId());
			filtro.append(cmbOrigem.getSelectedObject().getDescparada());
		}else {
			filtro.append(" Todas;");
		}

		filtro.append(" Destino: ");
		if (cmbDestino.getSelectedItem() != null) {
			parametros.put("destinoId", cmbDestino.getSelecteObject(Parada.class).getParadaId());
			filtro.append(cmbDestino.getSelecteObject(Parada.class).getDescparada());
		}else {
			filtro.append(" Todos;");
		}

		parametros.put("isLayoutArtesp", chkLayoutArtesp.isChecked());

		String rutaIds = "";
		String rutas = "";
		List<Ruta> lsLinhasSelecionadas = convertTypedList(linhaSelList.getData());

		filtro.append(" Linhas: ");
		if (lsLinhasSelecionadas.isEmpty()) {
			rutas = " Todas;";			
		} else {
			for (int i = 0; i < lsLinhasSelecionadas.size(); i++) {
				Ruta ruta = lsLinhasSelecionadas.get(i);
				rutas += ruta.getDescruta() + ", ";
				rutaIds += ruta.getRutaId() + ",";
			}
			// removendo ultima virgula
			rutaIds = rutaIds.substring(0, rutaIds.length() - 1);
			rutas = rutas.substring(0, rutas.length() - 2);
			parametros.put("LINHAS_ID", rutaIds);
			
		}

		filtro.append( rutas);
		parametros.put("LINHAS", rutas);
		parametros.put("FILTROS", filtro.toString());
		
		Relatorio relatorio = new RelatorioTabelaPreco(parametros, dataSourceRead.getConnection(), segVKMService);		

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

		openWindow("/component/reportView.zul",
				Labels.getLabel(TITULO), args, MODAL);
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		if (cmbVigencia.getValue() != null && cmbEmpresa.getValue() != null) {
			executarRelatorio();
		}
	}

	public void onClick$btnPesquisa(Event ev) {
		executarPesquisa();
	}

	public void onClick$btnLimpar(Event ev) {
		linhaList.setData(new ArrayList<Ruta>());
		txtLinha.setText("");
	}

	public void onDoubleClick$linhaSelList(Event ev) {
		Ruta linha = (Ruta) linhaSelList.getSelected();
		linhaSelList.removeItem(linha);
	}

	public void onDoubleClick$linhaList(Event ev) {
		Ruta ruta = (Ruta) linhaList.getSelected();
		linhaSelList.addItemNovo(ruta);
	}

	public void onClick$chkLayoutArtesp() {
		if (chkLayoutArtesp.isChecked()) {
			cmbOrgaoConcedente.setConstraint("no empty");
			cmbOrigem.setConstraint("no empty");
		} else {
			cmbOrgaoConcedente.setConstraint((String) null);
			cmbOrigem.setConstraint((String) null);
		}
	}

	public void onChange$cmbOrigem(Event ev) {
		Parada origem = cmbOrigem.getSelectedObject();
		destinoList = paradaService.obterPossiveisDestinos(origem);
		cmbDestino.setModel(new ListModelList(destinoList));
		if (destinoList.isEmpty()) {
			cmbDestino.setSelectedIndex(-1);
		}		
	}

	private void executarPesquisa() {
		HibernateSearchObject<Ruta> rutaBusqueda = new HibernateSearchObject<Ruta>(
				Ruta.class, pagingLinha.getPageSize());

		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			rutaBusqueda.addFilterEqual("lsRutaEmpresa.empresa", empresa);
		}

		if (cmbOrgaoConcedente.getSelectedItem() != null) {
			OrgaoConcedente orgaoConcedente = (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue();
			rutaBusqueda.addFilterEqual("orgaoConcedente", orgaoConcedente);
		}

		rutaBusqueda.addFilterILike("descruta", "%" + txtLinha.getValue() + "%");
		rutaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		plwRuta.init(rutaBusqueda, linhaList, pagingLinha);

		if (linhaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}

	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 MyComboboxEstandar getCmbVigencia() {
		return cmbVigencia;
	}

	public void setCmbVigencia(MyComboboxEstandar cmbVigencia) {
		this.cmbVigencia = cmbVigencia;
	}

	public List<VigenciaTarifa> getLsVigencia() {
		return lsVigencia;
	}

	public void setLsVigencia(List<VigenciaTarifa> lsVigencia) {
		this.lsVigencia = lsVigencia;
	}

	public MyComboboxEstandar getCmbOrgaoConcedente() {
		return cmbOrgaoConcedente;
	}

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

	public List<OrgaoConcedente> getLsOrcaoConcedente() {
		return lsOrcaoConcedente;
	}

	public void setLsOrcaoConcedente(List<OrgaoConcedente> lsOrcaoConcedente) {
		this.lsOrcaoConcedente = lsOrcaoConcedente;
	}

	public List<Parada> getDestinoList() {
		return destinoList;
	}

}
