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

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.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estacion;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioMovimentacaoEstoque;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstacion;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("relatorioMovimentacaoEstoqueController")
@Scope("prototype")
public class RelatorioMovimentacaoEstoqueController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private Datebox dataInicial;
	private Datebox dataFinal;	
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxPuntoVenta cmbPuntoVentaEnv;
	private MyComboboxPuntoVenta cmbPuntoVentaRec;
	private MyComboboxEstacion cmbEstacionEnv;
	private MyComboboxEstacion cmbEstacionRec;
	private List<Empresa> lsEmpresa;

	@Autowired
	private DataSource dataSourceRead;	
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		super.doAfterCompose(comp);			
	}

	/**
	 * @throws Exception
	 * 
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		Map<String, Object> parametros = new HashMap<String, Object>();


		parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioMovimentacaoEstoqueController.window.title"));
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario());
		
		StringBuilder filtro = new StringBuilder("Filtros\n");
		filtro.append(Labels.getLabel("lb.filtro.empresa"));
		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			if(empresa.getEmpresaId() > -1) {
				parametros.put("empresaId", empresa.getEmpresaId());
				filtro.append(empresa.getNombempresa());
			} else {
				filtro.append("Todas");
			}
		} else {
			filtro.append("Todas");
		}
		filtro.append("\n");

		filtro.append(Labels.getLabel("relatorioMovimentacaoEstoqueController.lb.puntoventaEnv"))
			  .append(": ");
		Comboitem itemPuntoVenta = cmbPuntoVentaEnv.getSelectedItem();
		if (itemPuntoVenta != null) {
			PuntoVenta puntoVenta = (PuntoVenta) itemPuntoVenta.getValue();
			if(puntoVenta.getPuntoventaId() > -1) {
				parametros.put("puntoventaIdEnv", puntoVenta.getPuntoventaId());
				filtro.append(puntoVenta.getNombpuntoventa());
			} else {
				filtro.append("Todas");
			}
		} else {
			filtro.append("Todas");
		}
		filtro.append("\n");

		filtro.append(Labels.getLabel("relatorioMovimentacaoEstoqueController.lb.puntoventaRec"))
		  	  .append(": ");		
		itemPuntoVenta = cmbPuntoVentaRec.getSelectedItem();
		if (itemPuntoVenta != null) {
			PuntoVenta puntoVenta = (PuntoVenta) itemPuntoVenta.getValue();
			if(puntoVenta.getPuntoventaId() > -1) {
				parametros.put("puntoventaIdRec", puntoVenta.getPuntoventaId());
				filtro.append(puntoVenta.getNombpuntoventa());
			} else {
				filtro.append("Todas");
			}
		} else {
			filtro.append("Todas");
		}
		filtro.append("\n");
		
		filtro.append(Labels.getLabel("relatorioMovimentacaoEstoqueController.lb.estacionEnv"))
			  .append(": ");
		Comboitem itemEstacion = cmbEstacionEnv.getSelectedItem();
		if (itemEstacion != null) {
			Estacion estacion = (Estacion) itemEstacion.getValue();
			if(estacion.getEstacionId() > -1) {
				parametros.put("estacionIdEnv", estacion.getEstacionId());
				filtro.append(estacion.getDescestacion());
			} else {
				filtro.append("Todas");
			}
		} else {
			filtro.append("Todas");
		}
		filtro.append("\n");
		
		filtro.append(Labels.getLabel("relatorioMovimentacaoEstoqueController.lb.estacionRec"))
			  .append(": ");
		itemEstacion = cmbEstacionRec.getSelectedItem();
		if (itemEstacion != null) {
			Estacion estacion = (Estacion) itemEstacion.getValue();
			if(estacion.getEstacionId() > -1) {
				parametros.put("estacionIdRec", estacion.getEstacionId());
				filtro.append(estacion.getDescestacion());
			} else {
				filtro.append("Todas");
			}
		} else {
			filtro.append("Todas");
		}
		filtro.append("\n");
		
		filtro.append("Período: ")
			  .append(DateUtil.getStringDate(dataInicial.getValue(), "dd/MM/yyyy"))
			  .append(" até ")
			  .append(DateUtil.getStringDate(dataFinal.getValue(), "dd/MM/yyyy"));
		parametros.put("dataInicial", DateUtil.getStringDate(dataInicial.getValue(), "dd/MM/yyyy"));
		parametros.put("dataFinal", DateUtil.getStringDate(dataFinal.getValue(), "dd/MM/yyyy"));
		
		parametros.put("FILTROS", filtro.toString());	
		Relatorio relatorio = new RelatorioMovimentacaoEstoque(parametros, dataSourceRead.getConnection());

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

		openWindow("/component/reportView.zul",
				Labels.getLabel("relatorioMovimentacaoEstoqueController.window.title"), args, MODAL);
	}
	
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception{
		executarRelatorio();
	}
	
	public Datebox getDatInicial() {
		return dataInicial;
	}

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

	public Datebox getDatFinal() {
		return dataFinal;
	}

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

	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;
	}

}
