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

import java.text.SimpleDateFormat;
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.Comboitem;
import org.zkoss.zul.Datebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioCaixaOrgaoConcedente;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
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;

@Controller("relatorioCaixaOrgaoConcedenteController")
@Scope("prototype")
public class RelatorioCaixaOrgaoConcedenteController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	private Datebox dataFinal;
	private Datebox dataInicial;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbOrgaoConcedente;
	private MyComboboxPuntoVenta cmbAgencia;
	private MyComboboxUsuario cmbUsuario;

	private List<Empresa> lsEmpresas;
	private List<OrgaoConcedente> lsOrgaoConcedente;

	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private OrgaoConcedenteService orgaocConcedenteService;
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresas = empresaService.obtenerTodos();
		lsOrgaoConcedente = orgaocConcedenteService.obtenerTodos();
		super.doAfterCompose(comp);
	}

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

	private void executarRelatorio() throws Exception {

		Map<String, Object> parametros = new HashMap<String, Object>();

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		if(!validaCampos()) {
			return;
		}

		if (this.dataInicial.getValue() != null) {
			parametros.put("fecInicio", sdf.format(this.dataInicial.getValue()));
		}
		if (this.dataFinal.getValue() != null) {
			parametros.put("fecFinal", sdf.format(this.dataFinal.getValue()));
		}

		
		if (cmbEmpresa.getSelectedIndex() != -1) {
			parametros.put("empresa", ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getEmpresaId());
			parametros.put("nomb_empresa", ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getNombempresa());

		} else {
			parametros.put("nomb_empresa", "TODAS");
		}

		if (cmbOrgaoConcedente.getSelectedItem() != null) {
			if (!cmbOrgaoConcedente.getSelectedItem().getValue().equals("-1")) {
				OrgaoConcedente orgaoConcedente = (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue();
				parametros.put("orgao_concedente_id", orgaoConcedente.getOrgaoConcedenteId());
				parametros.put("orgao_concedente_desc", orgaoConcedente.getDescOrgao());
				parametros.put("orgaoConcedente", orgaoConcedente.getDescOrgao().toString());
			}
		}else {
			parametros.put("orgao_concedente_id", -1);
			parametros.put("orgao_concedente_desc", "Todos");
			parametros.put("orgaoConcedente", "Todos");
		}


		if (cmbAgencia.getSelectedIndex() != -1) {
			PuntoVenta puntoVentaAux = (PuntoVenta) cmbAgencia.getSelectedItem().getValue();
			parametros.put("puntoVentaId", puntoVentaAux.getPuntoventaId());
			if (!puntoVentaAux.getPuntoventaId().toString().equals("-1")) {
				parametros.put("nombPuntoVenta", puntoVentaAux.getNombpuntoventa());
			}else {
				parametros.put("nombPuntoVenta", puntoVentaAux.getNombpuntoventa());
			}
		}else {
			parametros.put("puntoVentaId", -1);
			parametros.put("nombPuntoVenta", "Todos");
		}
		Comboitem cbiUsuario = cmbUsuario.getSelectedItem();
		if (cbiUsuario != null) {
			Usuario usuario = (Usuario) cbiUsuario.getValue();
			parametros.put("usuarioId", usuario.getUsuarioId());
			if(usuario.getUsuarioId() > -1) {
				parametros.put("nombUsuario", usuario.getNombUsuarioCompleto());
			} else {
				parametros.put("nombUsuario","Todos");
			}
		}else {
			parametros.put("usuarioId", -1);
			parametros.put("nombUsuario","Todos");
		}

		parametros.put("TITULO", Labels.getLabel("relatorioCaixaOrgaoConcedenteController.window.title"));

		Relatorio relatorio;
		relatorio = new RelatorioCaixaOrgaoConcedente(parametros, dataSourceRead.getConnection());

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

		openWindow("/component/reportView.zul",
				Labels.getLabel("relatorioCaixaOrgaoConcedenteController.window.title"), args, MODAL);

	}
	
	private boolean validaCampos() throws Exception{
		if (dataInicial.getValue() == null ||  dataFinal.getValue() ==null ) {
				Messagebox.show(Labels.getLabel("MSG.Error.invalida.dataInicialOuDataFinalNaoInformada"),
						Labels.getLabel("relatorioCaixaOrgaoConcedenteController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			
			return false;
		}
		
		
		if(DateUtil.compareOnlyDate(dataInicial.getValue(), dataFinal.getValue() ) >0 ) {
			Messagebox.show(Labels.getLabel("MSG.Error.invalida.dataInicialDepoisDataFinal"),
					Labels.getLabel("relatorioCaixaOrgaoConcedenteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		
		if(DateUtil.compareOnlyDate(dataInicial.getValue()) >0 ) {
			Messagebox.show(Labels.getLabel("relatorio.parametro.dataMenorDataAtual"),
					Labels.getLabel("relatorioCaixaOrgaoConcedenteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		
		if(cmbEmpresa.getValue()==null || cmbEmpresa.getValue().isEmpty()) {
			Messagebox.show(Labels.getLabel("MSG.Error.empresa.naoinformado"),
					Labels.getLabel("relatorioCaixaOrgaoConcedenteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		
		if(DateUtil.diferencaEntreDatasEmdias(dataInicial.getValue(), dataFinal.getValue()) > 30) {
			Messagebox.show(Labels.getLabel("MSG.Error.data.maiorquelimite"),
					Labels.getLabel("relatorioCaixaOrgaoConcedenteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		return true;

		
	}

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

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

	public List<OrgaoConcedente> getLsOrgaoConcedente() {
		return lsOrgaoConcedente;
	}

	public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
		this.lsOrgaoConcedente = lsOrgaoConcedente;
	}

	public Datebox getDataFinal() {
		return dataFinal;
	}

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

}
