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.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.Bandbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Radio;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioAgenciaFechamentoAntigo;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioAgenciaFechamentoDiario;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioAgenciaFechamentoNovo;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioAgenciaFechamentoResumo;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxMoeda;
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;

@Controller("relatorioAgenciaFechamentoController")
@Scope("prototype")
public class RelatorioAgenciaFechamentoController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(RelatorioAgenciaFechamentoController.class);

	@Autowired
	private DataSource dataSourceRead;
	@Autowired 
	private EmpresaService empresaService;
	
	private Datebox datInicial;
	private Datebox datFinal;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxMoeda cmbMoeda;
	private Bandbox bbPesquisaPuntoVenta;
	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;
	private MyTextbox txtNombrePuntoVenta;
	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelList;
	private Paging pagingPuntoVenta;
	
	private Radio radLayoutNovo;
	private Radio radLayoutAntigo;
	private Radio radLayoutDiario;
	private Radio radLayoutResumo;
	
	private List<Empresa> lsEmpresas;
	
	@SuppressWarnings({"unchecked", "rawtypes"})
	private void executarRelatorio() throws Exception {

		Map<String, Object> parametros = new HashMap<String, Object>();
		Empresa empresa =  cmbEmpresa.getSelectedItem() != null ? (Empresa)cmbEmpresa.getSelectedItem().getValue() : null;
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		parametros.put("fecInicio", sdf.format(this.datInicial.getValue()));
		parametros.put("fecFinal", sdf.format(this.datFinal.getValue()));
		if (empresa != null){
			parametros.put("empresa", empresa.getEmpresaId());
			parametros.put("empresaNome", empresa.getNombempresa());
		}
		parametros.put("TITULO", Labels.getLabel("indexController.mniRelatorioAgenciaFechamento.label"));
		
		Comboitem itemMoeda = cmbMoeda.getSelectedItem();
		if (itemMoeda != null ) {
			Moneda moeda = (Moneda) itemMoeda.getValue();
			parametros.put("MOEDA_ID", moeda.getMonedaId());
			parametros.put("MOEDA_SIMBOLO", moeda.getSimbolo());
		}
		
		String puntoVentaIds = "";
		String puntoVentas = "";
		List<PuntoVenta> lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(puntoVentaSelList.getData()));
		if (lsPuntoVentaSelecionados.isEmpty()) {
			puntoVentas = "Todas";
		} else {
			for (int i = 0; i < lsPuntoVentaSelecionados.size(); i++) {
				PuntoVenta puntoVenta = lsPuntoVentaSelecionados.get(i);
				puntoVentas = puntoVentas + puntoVenta.getNombpuntoventa() + ",";

				puntoVentaIds = puntoVentaIds + puntoVenta.getPuntoventaId() + ",";
			}

			// removendo ultima virgula
			puntoVentaIds = puntoVentaIds.substring(0, puntoVentaIds.length() - 1);
			puntoVentas = puntoVentas.substring(0, puntoVentas.length() - 1);
			parametros.put("NUMPUNTOVENTA", puntoVentaIds);
		}
		
		Relatorio relatorio;
		Map<String, Object> args = new HashMap<String, Object>();
		if (radLayoutNovo.isChecked()) {			
			relatorio = new RelatorioAgenciaFechamentoNovo(parametros, dataSourceRead.getConnection());
			args.put("relatorio", relatorio);

		}else if (radLayoutAntigo.isChecked()){
			relatorio = new RelatorioAgenciaFechamentoAntigo(parametros, dataSourceRead.getConnection());
			args.put("relatorio", relatorio);

		} else if(radLayoutDiario.isChecked()) {
			relatorio = new RelatorioAgenciaFechamentoDiario(parametros, dataSourceRead.getConnection());
			args.put("relatorio", relatorio);
		} else {
			relatorio = new RelatorioAgenciaFechamentoResumo(parametros, dataSourceRead.getConnection());
			args.put("relatorio", relatorio);
		}
		
		openWindow("/component/reportView.zul",
				Labels.getLabel("indexController.mniRelatorioAgenciaFechamento.label"), args, MODAL);

	}

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

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresas = empresaService.obtenerTodos();
		lsEmpresas.add(0, new Empresa(-1,"TODAS"));
		super.doAfterCompose(comp);
		puntoVentaList.setItemRenderer(new RenderRelatorioVendasBilheteiro());
		puntoVentaSelList.setItemRenderer(new RenderRelatorioVendasBilheteiroSelecionados());
	}
	
	private void executarPesquisa() {
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda =
				new HibernateSearchObject<PuntoVenta>(PuntoVenta.class, pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterILike("nombpuntoventa", "%" + txtNombrePuntoVenta.getValue() + "%");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		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) {
				log.error(ex);
			}
		}
	}

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

	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 MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

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

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public Radio getRadLayoutNovo() {
		return radLayoutNovo;
	}

	public void setRadLayoutNovo(Radio radLayoutNovo) {
		this.radLayoutNovo = radLayoutNovo;
	}

	public Radio getRadLayoutAntigo() {
		return radLayoutAntigo;
	}

	public void setRadLayoutAntigo(Radio radLayoutAntigo) {
		this.radLayoutAntigo = radLayoutAntigo;
	}

	public Radio getRadLayoutDiario() {
		return radLayoutDiario;
	}

	public void setRadLayoutDiario(Radio radLayoutDiario) {
		this.radLayoutDiario = radLayoutDiario;
	}

	public MyComboboxMoeda getCmbMoeda() {
		return cmbMoeda;
	}

	public void setCmbMoeda(MyComboboxMoeda cmbMoeda) {
		this.cmbMoeda = cmbMoeda;
	}

	public Radio getRadLayoutResumo() {
		return radLayoutResumo;
	}

	public void setRadLayoutResumo(Radio radLayoutResumo) {
		this.radLayoutResumo = radLayoutResumo;
	}
}
