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

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.Bandbox;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Doublebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PricingEspecifico;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioPricingEspecifico;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
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.RenderRelatorioVendasBilheteiro;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiroSelecionados;

/**
 * 
 * @author Valdir Cordeiro
 */
@Controller("relatorioPricingEspecificoController")
@Scope("prototype")
public class RelatorioPricingEspecificoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private MonedaService monedaService;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private TipoPuntoVentaService puntoVentaService;
	private List<Marca> lsMarca;
	private List<Moneda> lsMoneda;
	private List<Categoria> lsCategoria;
	private List<ClaseServicio> lsClaseServicio;
	private List<TipoPuntoVenta> lsPtovata;
	@Autowired
	private transient PagedListWrapper<PricingEspecifico> plwPricingEspecifico;
	private Combobox cmbMarca;
	private Combobox cmbMoneda;
	private Combobox cmbTipoPassageiro;
	private Combobox cmbTipoServicio;
	private Combobox cmbPtovta;
	private Combobox cmbOrigem;
	private Combobox cmbDestino;
	
	private Datebox inicioDataViagem;
	private Datebox fimDataViagem;
	
	private Datebox inicioDataVenda;
	private Datebox fimDataVenda;
	
	private Textbox txtNombrePricing;
	private Intbox txtCodigoServico;
	
	private Doublebox txtTarifa;
	
	@Autowired
	private DataSource dataSourceRead;
	
	private MyTextbox txtNombrePuntoVenta;
	private Bandbox bbPesquisaPuntoVenta;
	private Paging pagingPuntoVenta;
	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelList;
	
	private Checkbox chkDomingo;
	private Checkbox chkSegunda;
	private Checkbox chkTerca;
	private Checkbox chkQuarta;
	private Checkbox chkQuinta;
	private Checkbox chkSexta;
	private Checkbox chkSabado;
	
	private Intbox ocupacaoInicial;
	private Intbox ocupacaoFinal;
	
	private Doublebox txtTarifaOcupacao;
	private Doublebox txtDescontoOcupacao;
	
	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsMarca = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
		lsMoneda = monedaService.obtenerTodos();
		lsCategoria = categoriaService.obtenerTodos();
		lsClaseServicio = claseServicioService.obtenerTodos();
		lsPtovata = puntoVentaService.obtenerTodos();

		super.doAfterCompose(comp);
		
		puntoVentaList.setItemRenderer(new RenderRelatorioVendasBilheteiro());
		puntoVentaSelList.setItemRenderer(new RenderRelatorioVendasBilheteiroSelecionados());
		
		txtNombrePricing.focus();
	}

	public void onClick$btnRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}
	
	public void onDoubleClick$puntoVentaSelList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaSelList.getSelected();
		puntoVentaSelList.removeItem(puntoVenta);
	}

	public void onDoubleClick$puntoVentaList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaList.getSelected();
		puntoVentaSelList.addItemNovo(puntoVenta);
	}
	
	public void onClick$btnLimpar(Event ev) {
		puntoVentaList.setData(new ArrayList<PuntoVenta>());
		bbPesquisaPuntoVenta.setText("");
	}
	
	public void onClick$btnPesquisa(Event ev) {
		executarPesquisa();
	}
	
	private void executarPesquisa() {
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda = new HibernateSearchObject<PuntoVenta>(PuntoVenta.class, pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterILike("nombpuntoventa", "%" + txtNombrePuntoVenta.getValue() + "%");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);
		puntoVentaBusqueda.addFilterNotEqual("puntoventaId", -1);
		puntoVentaBusqueda.addSortAsc("nombpuntoventa");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);
		plwPuntoVenta.init(puntoVentaBusqueda, puntoVentaList, pagingPuntoVenta);

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

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		Relatorio relatorio;
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");

		if (inicioDataViagem.getValue() != null) {
			parametros.put("DATA_INICIO_VIAGEM", (java.util.Date) inicioDataViagem.getValue());
			parametros.put("DATA_FIM_VIAGEM", (java.util.Date) fimDataViagem.getValue());

			filtro.append("Data Viagem: ")
					.append(format.format(inicioDataViagem.getValue()))
					.append(" - ")
					.append(format.format(fimDataViagem.getValue()))
					.append(";");
		}
		
		if (inicioDataVenda.getValue() != null) {
			parametros.put("DATA_INICIO_VENDA", (java.util.Date) inicioDataVenda.getValue());
			parametros.put("DATA_FIM_VENDA", (java.util.Date) fimDataVenda.getValue());

			filtro.append("Data Venda: ")
					.append(format.format(inicioDataVenda.getValue()))
					.append(" - ")
					.append(format.format(fimDataVenda.getValue()))
					.append(";");
		}		
		
		filtro.append("Origem: ");
		Parada parada = (Parada) (cmbOrigem.getSelectedItem() != null ? cmbOrigem.getSelectedItem().getValue() : null);
		if(parada != null) {
			parametros.put("ORIGEM", parada.getParadaId());
			filtro.append(parada.getDescparada());
		} else {
			filtro.append(" Todas; ");
		}
		
		filtro.append("Destino: ");
		Parada parada1 = (Parada) (cmbDestino.getSelectedItem() != null ? cmbDestino.getSelectedItem().getValue() : null);
		if(parada1 != null) {
			parametros.put("DESTINO", parada1.getParadaId());
			filtro.append(parada1.getDescparada());
		} else {
			filtro.append(" Todas; ");
		}

		parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioPricingEspecificoController.window.title"));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		parametros.put("USUARIO_NOME", UsuarioLogado.getUsuarioLogado().getNombusuario());
		
		filtro.append("Marca: ");
		Comboitem itemMarca = cmbMarca.getSelectedItem();
		if (itemMarca != null) {
			Marca marca = (Marca) itemMarca.getValue();
			parametros.put("MARCA_ID", marca.getMarcaId().intValue());
			filtro.append(marca.getDescmarca() + ";");
		} else {
			filtro.append(" Todas;  ");
		}
		
		filtro.append("Tipo Passageiro: ");
		Categoria categoria = (Categoria) (cmbTipoPassageiro.getSelectedItem() != null ? cmbTipoPassageiro.getSelectedItem().getValue() : null);
		if (categoria != null) {
			parametros.put("TIPO_PASSAGEIRO", categoria.getCategoriaId());
			filtro.append(categoria.getDesccategoria() + ";");
		} else {
			filtro.append(" Todos;  ");
		}
		
		filtro.append("Tipo Classe: ");
		ClaseServicio claseServicio = (ClaseServicio) (cmbTipoServicio.getSelectedItem() != null ? cmbTipoServicio.getSelectedItem().getValue() : null);
		if (claseServicio != null) {
			parametros.put("TIPO_CLASSE", claseServicio.getClaseservicioId());
			filtro.append(claseServicio.getDescclase() + ";");
		} else {
			filtro.append(" Todas;  ");
		}
		
		filtro.append("Canal de Venda: ");
		TipoPuntoVenta tipoPuntoVenta = (TipoPuntoVenta) (cmbPtovta.getSelectedItem() != null ? cmbPtovta.getSelectedItem().getValue() : null);
		if (tipoPuntoVenta != null) {
			parametros.put("CANAL_DE_VENDA", tipoPuntoVenta.getTipoptovtaId().intValue());
			filtro.append(tipoPuntoVenta.getDesctipo() + ";");
		} else {
			filtro.append(" Todos;  ");
		}
		
		filtro.append("serviço: ");
		Integer codServico = txtCodigoServico.getValue();
		if (codServico != null) {
			parametros.put("CORRIDA_ID", codServico);
			filtro.append(codServico + ";");
		} else {
			filtro.append(" Todos;  ");
		}
		
		filtro.append("Agência: ");
		String puntoVentaIds = "";
		String puntoVentas = "";
		List<PuntoVenta> lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(puntoVentaSelList.getData()));
		if (lsPuntoVentaSelecionados.size() > 0) {
			for (int i = 0; i < lsPuntoVentaSelecionados.size(); i++) {
				PuntoVenta puntoVenta = lsPuntoVentaSelecionados.get(i);
				puntoVentas = puntoVentas + puntoVenta.getNombpuntoventa() + ",";
				puntoVentaIds = puntoVentaIds + puntoVenta.getPuntoventaId() + ",";
			}

			puntoVentaIds = puntoVentaIds.substring(0, puntoVentaIds.length() - 1);
			puntoVentas = puntoVentas.substring(0, puntoVentas.length() - 1);
			parametros.put("NUMPUNTOVENTA", puntoVentaIds);
		} else {
			filtro.append("Todas; ");
		}

		filtro.append(puntoVentas).append(";");
		
		filtro.append(" Dias da Semana: ");
		if( chkDomingo.isChecked() && chkSegunda.isChecked() && chkTerca.isChecked() && chkQuarta.isChecked() && chkQuinta.isChecked() && chkSexta.isChecked() && chkSabado.isChecked()) {
			filtro.append(" Todos; ");
		} else {
			filtro.append(chkDomingo.isChecked() ? "Dom " : "");
			parametros.put("DOMINGO", chkDomingo.isChecked());
			
			filtro.append(chkSegunda.isChecked() ? "Seg " : "");
			parametros.put("SEGUNDA", chkSegunda.isChecked());
			
			filtro.append(chkTerca.isChecked() ? "Ter " : "");
			parametros.put("TERCA", chkTerca.isChecked());
			
			filtro.append(chkQuarta.isChecked() ? "Qua " : "");
			parametros.put("QUARTA", chkQuarta.isChecked());
			
			filtro.append(chkQuinta.isChecked() ? "Qui " : "");
			parametros.put("QUINTA", chkQuinta.isChecked());
			
			filtro.append(chkSexta.isChecked() ? "Sex " : "");
			parametros.put("SEXTA", chkSexta.isChecked());
			
			filtro.append(chkSabado.isChecked() ? "Sab " : "");
			parametros.put("SABADO", chkSabado.isChecked());
		}
		
		String nomePricing = txtNombrePricing.getText().trim();
		if (!nomePricing.isEmpty()) {
			parametros.put("NOMBPRICING", "%" + nomePricing + "%");
			filtro.append("; Nome Pricing: " + nomePricing);
		}

		Double tarifaVolta = txtTarifa.getValue();
		if (tarifaVolta != null) {
			parametros.put("TARIFAVOLTA", tarifaVolta);
			filtro.append("; Tarifa Volta: " + tarifaVolta);
		}
		
		Double tarifaOcupcao = txtTarifaOcupacao.getValue();
		if (tarifaOcupcao != null) {
			parametros.put("TARIFAOCUPACAO", tarifaOcupcao);
			filtro.append("; Tarifa: " + tarifaOcupcao);
		}
		
		Double descontoOcupcao = txtDescontoOcupacao.getValue();
		if (descontoOcupcao != null) {
			parametros.put("DESCONTOOCUPACAO", descontoOcupcao);
			filtro.append("; Desconto: " + descontoOcupcao);
		}
		
		Integer ocpInicial = ocupacaoInicial.getValue();
		if (ocpInicial != null) {
			parametros.put("OCUPACAOINICIAL", ocpInicial);
			filtro.append("; Ocupação Inicial: " + ocpInicial);
		}
		
		Integer ocpFinal = ocupacaoFinal.getValue();
		if (ocpFinal != null) {
			parametros.put("OCUPACAOFINAL", ocpFinal);
			filtro.append("; Ocupação Final: " + ocpFinal);
		}
		
		if((ocpInicial != null && ocpFinal == null) || (ocpFinal != null && ocpInicial == null)) {
			Messagebox.show(Labels.getLabel("editarPricingController.ErroOcupacao"), Labels.getLabel("relatorioPricingEspecificoController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		
		parametros.put("FILTROS", filtro.toString());
		relatorio = new RelatorioPricingEspecifico(parametros, dataSourceRead.getConnection());

		Map args = new HashMap();
		args.put("relatorio", relatorio);

		openWindow("/component/reportView.zul",
				Labels.getLabel("relatorioPricingEspecificoController.window.title"), args, MODAL);
	}
	
	public List<Marca> getLsMarca() {
		return lsMarca;
	}

	public void setLsMarca(List<Marca> lsMarca) {
		this.lsMarca = lsMarca;
	}

	public List<Moneda> getLsMoneda() {
		return lsMoneda;
	}

	public void setLsMoneda(List<Moneda> lsMoneda) {
		this.lsMoneda = lsMoneda;
	}

	public MarcaService getMarcaService() {
		return marcaService;
	}

	public void setMarcaService(MarcaService marcaService) {
		this.marcaService = marcaService;
	}

	public MonedaService getMonedaService() {
		return monedaService;
	}

	public void setMonedaService(MonedaService monedaService) {
		this.monedaService = monedaService;
	}

	public PagedListWrapper<PricingEspecifico> getPlwPricingEspecifico() {
		return plwPricingEspecifico;
	}

	public void setPlwPricingEspecifico(PagedListWrapper<PricingEspecifico> plwPricingEspecifico) {
		this.plwPricingEspecifico = plwPricingEspecifico;
	}

	public List<Categoria> getLsCategoria() {
		return lsCategoria;
	}

	public void setLsCategoria(List<Categoria> lsCategoria) {
		this.lsCategoria = lsCategoria;
	}

	public List<ClaseServicio> getLsClaseServicio() {
		return lsClaseServicio;
	}

	public void setLsClaseServicio(List<ClaseServicio> lsClaseServicio) {
		this.lsClaseServicio = lsClaseServicio;
	}

	public CategoriaService getCategoriaService() {
		return categoriaService;
	}

	public void setCategoriaService(CategoriaService categoriaService) {
		this.categoriaService = categoriaService;
	}

	public ClaseServicioService getClaseServicioService() {
		return claseServicioService;
	}

	public void setClaseServicioService(ClaseServicioService claseServicioService) {
		this.claseServicioService = claseServicioService;
	}

	public Combobox getCmbMarca() {
		return cmbMarca;
	}

	public void setCmbMarca(Combobox cmbMarca) {
		this.cmbMarca = cmbMarca;
	}

	public Combobox getCmbMoneda() {
		return cmbMoneda;
	}

	public void setCmbMoneda(Combobox cmbMoneda) {
		this.cmbMoneda = cmbMoneda;
	}

	public Combobox getCmbTipoPassageiro() {
		return cmbTipoPassageiro;
	}

	public void setCmbTipoPassageiro(Combobox cmbTipoPassageiro) {
		this.cmbTipoPassageiro = cmbTipoPassageiro;
	}

	public Combobox getCmbTipoServicio() {
		return cmbTipoServicio;
	}

	public void setCmbTipoServicio(Combobox cmbTipoServicio) {
		this.cmbTipoServicio = cmbTipoServicio;
	}

	public ParadaService getParadaService() {
		return paradaService;
	}

	public void setParadaService(ParadaService paradaService) {
		this.paradaService = paradaService;
	}

	public List<TipoPuntoVenta> getLsPtovata() {
		return lsPtovata;
	}

	public void setLsPtovata(List<TipoPuntoVenta> lsPtovata) {
		this.lsPtovata = lsPtovata;
	}

	public TipoPuntoVentaService getPuntoVentaService() {
		return puntoVentaService;
	}

	public void setPuntoVentaService(TipoPuntoVentaService puntoVentaService) {
		this.puntoVentaService = puntoVentaService;
	}

	public Combobox getCmbPtovta() {
		return cmbPtovta;
	}

	public void setCmbPtovta(Combobox cmbPtovta) {
		this.cmbPtovta = cmbPtovta;
	}

	public Combobox getCmbOrigem() {
		return cmbOrigem;
	}

	public void setCmbOrigem(Combobox cmbOrigem) {
		this.cmbOrigem = cmbOrigem;
	}

	public Combobox getCmbDestino() {
		return cmbDestino;
	}

	public void setCmbDestino(Combobox cmbDestino) {
		this.cmbDestino = cmbDestino;
	}

	public Datebox getInicioDataViagem() {
		return inicioDataViagem;
	}

	public void setInicioDataViagem(Datebox inicioDataViagem) {
		this.inicioDataViagem = inicioDataViagem;
	}

	public Datebox getFimDataViagem() {
		return fimDataViagem;
	}

	public void setFimDataViagem(Datebox fimDataViagem) {
		this.fimDataViagem = fimDataViagem;
	}

	public Datebox getInicioDataVenda() {
		return inicioDataVenda;
	}

	public void setInicioDataVenda(Datebox inicioDataVenda) {
		this.inicioDataVenda = inicioDataVenda;
	}

	public Datebox getFimDataVenda() {
		return fimDataVenda;
	}

	public void setFimDataVenda(Datebox fimDataVenda) {
		this.fimDataVenda = fimDataVenda;
	}

	public Textbox getTxtNombrePricing() {
		return txtNombrePricing;
	}

	public void setTxtNombrePricing(Textbox txtNombrePricing) {
		this.txtNombrePricing = txtNombrePricing;
	}

	public Intbox getTxtCodigoServico() {
		return txtCodigoServico;
	}

	public void setTxtCodigoServico(Intbox txtCodigoServico) {
		this.txtCodigoServico = txtCodigoServico;
	}

	public Doublebox getTxtTarifa() {
		return txtTarifa;
	}

	public void setTxtTarifa(Doublebox txtTarifa) {
		this.txtTarifa = txtTarifa;
	}
	
	public PagedListWrapper<PuntoVenta> getPlwPuntoVenta() {
		return plwPuntoVenta;
	}

	public void setPlwPuntoVenta(PagedListWrapper<PuntoVenta> plwPuntoVenta) {
		this.plwPuntoVenta = plwPuntoVenta;
	}
	
	public MyListbox getPuntoVentaSelList() {
		return puntoVentaSelList;
	}

	public void setPuntoVentaSelList(MyListbox puntoVentaSelList) {
		this.puntoVentaSelList = puntoVentaSelList;
	}

	public Intbox getOcupacaoInicial() {
		return ocupacaoInicial;
	}

	public void setOcupacaoInicial(Intbox ocupacaoInicial) {
		this.ocupacaoInicial = ocupacaoInicial;
	}

	public Intbox getOcupacaoFinal() {
		return ocupacaoFinal;
	}

	public void setOcupacaoFinal(Intbox ocupacaoFinal) {
		this.ocupacaoFinal = ocupacaoFinal;
	}

	public Doublebox getTxtTarifaOcupacao() {
		return txtTarifaOcupacao;
	}

	public void setTxtTarifaOcupacao(Doublebox txtTarifaOcupacao) {
		this.txtTarifaOcupacao = txtTarifaOcupacao;
	}

	public Doublebox getTxtDescontoOcupacao() {
		return txtDescontoOcupacao;
	}

	public void setTxtDescontoOcupacao(Doublebox txtDescontoOcupacao) {
		this.txtDescontoOcupacao = txtDescontoOcupacao;
	}
}
