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

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

import com.rjconsultores.ventaboletos.constantes.Constantes.FiltroEnviadosSefaz;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendaEmbarcada;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEmpresa;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxUsuario;
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.RenderRelatorioLinhaHorario;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRuta;

@Controller("relatorioVendaEmbarcadaController")
@Scope("prototype")
public class RelatorioVendaEmbarcadaController extends MyGenericForwardComposer {

	private static final String TODAS = "Todas";
	private static final String TODOS = "Todos";
	private static final String TITULO = "relatorioVendaEmbarcadaController.window.title";
	private static final long serialVersionUID = 1L;
	
	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private EstadoService estadoService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	@Autowired
	private RutaService rutaService;
	
	private MyComboboxEmpresa cmbEmpresa;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private MyComboboxUsuario cmbUsuario;
	private Datebox datInicial;
	private Datebox datFinal;
	private Checkbox chkBloqueado;
	private Radio radEnvioSim;
	private Radio radEnvioNao;
	private Radio radEnvioAmbos;
	private Radio radVendaEmbarcadaSim;
	private Radio radVendaEmbarcadaNao;
	private Radio radVendaEmbarcadaAmbos;
	private MyComboboxEstandar cmbEstado;
	private MyComboboxEstandar cmbOrgaoConcedente;
	private Checkbox chkQuebraSequencia;
	private MyTextbox txtSerie;
	private Checkbox chkUltimoBpe;
	private MyTextbox txtNumBpe;
	
	private List<Estado> lsEstados;
	private List<OrgaoConcedente> lsOrgaosConcedentes;
	
	private Textbox txtLinha;
	private MyListbox linhaList;
	private MyListbox linhaListSelList;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEstados = estadoService.obtenerTodos();
		setLsOrgaosConcedentes(orgaoConcedenteService.obtenerTodos());
		
		super.doAfterCompose(comp);
		
		linhaList.setItemRenderer(new RenderRuta());
		linhaListSelList.setItemRenderer(new RenderRuta());
	}
	
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}

	private void executarRelatorio() throws Exception {
		StringBuilder filtro = new StringBuilder();

		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("TITULO", Labels.getLabel(TITULO));
		parametros.put("NOME_RELATORIO", Labels.getLabel(TITULO));
		parametros.put("USUARIO_ID", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario());
		parametros.put("DATA_INICIAL", datInicial.getValue());
		parametros.put("DATA_FINAL", datFinal.getValue());
		
		filtro.append(Labels.getLabel("lb.filtro.empresa"));
		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			filtro.append( empresa.getNombempresa() );			
			parametros.put("EMPRESA_ID", empresa.getEmpresaId());
		}else {
			filtro.append(TODAS);
		}
		filtro.append("; ");
		
		filtro.append(Labels.getLabel("lb.filtro.pdv"));
		Comboitem itemPuntoVenta = cmbPuntoVenta.getSelectedItem();
		if (itemPuntoVenta != null) {
			PuntoVenta ptovta = (PuntoVenta) itemPuntoVenta.getValue();
			parametros.put("PUNTOVENTA", ptovta.getNombpuntoventa());
			parametros.put("PUNTOVENTA_ID", ptovta.getPuntoventaId());
		}else {
			filtro.append(TODAS);
		}
		filtro.append("; ");

		filtro.append(Labels.getLabel("lb.filtro.estado"));
		Comboitem itemEstado = cmbEstado.getSelectedItem();
		if (itemEstado != null) {
			Estado estado = (Estado) itemEstado.getValue();
			filtro.append(estado.getNombestado());
			parametros.put("ESTADO_ID", estado.getEstadoId());
		}else {
			filtro.append(TODOS);
		}
		filtro.append("; ");
		
		
		filtro.append("Envio Sefaz: ");
		FiltroEnviadosSefaz filtroSefaz;
		if (radEnvioAmbos.isChecked()){
			filtroSefaz = FiltroEnviadosSefaz.TODOS;
			filtro.append(TODOS);
		} else if (radEnvioNao.isChecked()){
			filtroSefaz = FiltroEnviadosSefaz.NAO;
			filtro.append(TODOS);
		} else {
			filtroSefaz = FiltroEnviadosSefaz.SIM;
		}
		parametros.put("ENVIOSEFAZ", filtroSefaz);
		filtro.append(filtroSefaz).append("; ");
		
		filtro.append("Venda Embarcada: ");
		FiltroEnviadosSefaz vendaEmbarcada;
		if (radVendaEmbarcadaAmbos.isChecked()){
			vendaEmbarcada = FiltroEnviadosSefaz.TODOS;
		} else if (radVendaEmbarcadaNao.isChecked()){
			vendaEmbarcada = FiltroEnviadosSefaz.NAO;
		} else {
			vendaEmbarcada = FiltroEnviadosSefaz.SIM;
		}
		
		parametros.put("VENDAEMBARCADA", vendaEmbarcada);
		filtro.append(vendaEmbarcada).append("; ");

		filtro.append(Labels.getLabel("lb.filtro.orgaoConcedente"));
		if (cmbOrgaoConcedente.getSelectedIndex() != -1) {			
			parametros.put("orgaoConcedenteId", ((OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue()).getOrgaoConcedenteId());
			filtro.append(((OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue()).getDescOrgao());
		}else {
			filtro.append(TODOS);
		}
		filtro.append("; ");
		
		
		StringBuilder linhas = new StringBuilder();
		StringBuilder linhaIds = new StringBuilder();
		
		filtro.append(Labels.getLabel("lb.filtro.linha"));
		if (linhaListSelList.getListData().isEmpty()) {
			linhas.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("linhaIds", linhaIds.toString());
		filtro.append(linhas).append(";");
		
		filtro.append(Labels.getLabel("lb.filtro.usuario"));
		Comboitem cbiUsuario = cmbUsuario.getSelectedItem();
		if (cbiUsuario != null) {
			Usuario usuario = (Usuario) cbiUsuario.getValue();
			parametros.put("usuarioId", usuario.getUsuarioId());
			if(usuario.getUsuarioId() > -1) {
				filtro.append(usuario.getNombUsuarioCompleto());
			}
		} else {
			filtro.append(TODOS);
		}
		
		filtro.append("; ");
		
		parametros.put("SERIE", txtSerie.getText());
		parametros.put("NUMBPE", txtNumBpe.getText());
		parametros.put("QUEBRASEQ", chkQuebraSequencia.isChecked());
		parametros.put("BLOQUEADO", chkBloqueado.isChecked());
		parametros.put("QUEBRASEQUENCIA", chkQuebraSequencia.isChecked());
		parametros.put("ULTIMOBPE", chkUltimoBpe.isChecked());
		
		parametros.put("FILTROS", filtro.toString());
		Relatorio relatorio = new RelatorioVendaEmbarcada(parametros, dataSourceRead.getConnection());
		
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

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

		String palavraPesquisaRuta = txtLinha.getText();

		if (cmbOrgaoConcedente.getSelectedItem() != null) {
			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(TITULO),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}
	
	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 EstadoService getEstadoService() {
		return estadoService;
	}

	public void setEstadoService(EstadoService estadoService) {
		this.estadoService = estadoService;
	}

	public MyComboboxEmpresa getCmbEmpresa() {
		return cmbEmpresa;
	}

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

	public MyComboboxPuntoVenta getCmbPuntoVenta() {
		return cmbPuntoVenta;
	}

	public void setCmbPuntoVenta(MyComboboxPuntoVenta cmbPuntoVenta) {
		this.cmbPuntoVenta = cmbPuntoVenta;
	}

	public Datebox getDatInicial() {
		return datInicial;
	}

	public void setDatInicial(Datebox datInicial) {
		this.datInicial = datInicial;
	}

	public Datebox getDatFinal() {
		return datFinal;
	}

	public void setDatFinal(Datebox datFinal) {
		this.datFinal = datFinal;
	}

	public List<Estado> getLsEstados() {
		return lsEstados;
	}

	public void setLsEstados(List<Estado> lsEstados) {
		this.lsEstados = lsEstados;
	}

	public Checkbox getChkBloqueado() {
		return chkBloqueado;
	}

	public void setChkBloqueado(Checkbox chkBloqueado) {
		this.chkBloqueado = chkBloqueado;
	}

	public Radio getRadEnvioSim() {
		return radEnvioSim;
	}

	public void setRadEnvioSim(Radio radEnvioSim) {
		this.radEnvioSim = radEnvioSim;
	}

	public Radio getRadEnvioNao() {
		return radEnvioNao;
	}

	public void setRadEnvioNao(Radio radEnvioNao) {
		this.radEnvioNao = radEnvioNao;
	}

	public Radio getRadEnvioAmbos() {
		return radEnvioAmbos;
	}

	public void setRadEnvioAmbos(Radio radEnvioAmbos) {
		this.radEnvioAmbos = radEnvioAmbos;
	}

	public MyComboboxEstandar getCmbEstado() {
		return cmbEstado;
	}

	public void setCmbEstado(MyComboboxEstandar cmbEstado) {
		this.cmbEstado = cmbEstado;
	}

	public Checkbox getChkQuebraSequencia() {
		return chkQuebraSequencia;
	}

	public void setChkQuebraSequencia(Checkbox chkQuebraSequencia) {
		this.chkQuebraSequencia = chkQuebraSequencia;
	}

	public MyTextbox getTxtSerie() {
		return txtSerie;
	}

	public void setTxtSerie(MyTextbox txtSerie) {
		this.txtSerie = txtSerie;
	}

	public Checkbox getChkUltimoBpe() {
		return chkUltimoBpe;
	}

	public void setChkUltimoBpe(Checkbox chkUltimoBpe) {
		this.chkUltimoBpe = chkUltimoBpe;
	}

	public MyTextbox getTxtNumBpe() {
		return txtNumBpe;
	}

	public void setTxtNumBpe(MyTextbox txtNumBpe) {
		this.txtNumBpe = txtNumBpe;
	}

	public Radio getRadVendaEmbarcadaSim() {
		return radVendaEmbarcadaSim;
	}

	public void setRadVendaEmbarcadaSim(Radio radVendaEmbarcadaSim) {
		this.radVendaEmbarcadaSim = radVendaEmbarcadaSim;
	}

	public Radio getRadVendaEmbarcadaNao() {
		return radVendaEmbarcadaNao;
	}

	public void setRadVendaEmbarcadaNao(Radio radVendaEmbarcadaNao) {
		this.radVendaEmbarcadaNao = radVendaEmbarcadaNao;
	}

	public Radio getRadVendaEmbarcadaAmbos() {
		return radVendaEmbarcadaAmbos;
	}

	public void setRadVendaEmbarcadaAmbos(Radio radVendaEmbarcadaAmbos) {
		this.radVendaEmbarcadaAmbos = radVendaEmbarcadaAmbos;
	}

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

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

	public MyComboboxUsuario getCmbUsuario() {
		return cmbUsuario;
	}

	public void setCmbUsuario(MyComboboxUsuario cmbUsuario) {
		this.cmbUsuario = cmbUsuario;
	}

}
