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

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.lang.Objects;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ComboitemRenderer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Radiogroup;

import com.rjconsultores.ventaboletos.entidad.Aidf;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDocumentosFiscais;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDocumentosFiscaisAgrupadoPorLocalidade;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.AidfService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("relatorioDocumentosFiscaisController")
@Scope("prototype")
public class RelatorioDocumentosFiscaisController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private EstadoService estadoService;
	private List<Empresa> lsEmpresa;
	private List<Estado> lsEstado;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbEstado;
	private MyComboboxEstandar cmbAidf;
	private Datebox datInicial;
	private Datebox datFinal;
	@Autowired
	private DataSource dataSourceRead;
	private List<Aidf> aidfList;
	private Checkbox ckbSomenteCancelado;
	private Radiogroup rdgInterestadualMunicial;
	private Radiogroup rdTipoAgrupamento;
	private Radiogroup rdEspecie;
	@Autowired
	private AidfService aidfService;
	private List<Aidf> lsAidf;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresa = empresaService.obtenerTodos();

		lsEstado = new ArrayList<Estado>();
		Estado estadoTodos = new Estado(-1);
		estadoTodos.setNombestado("TODOS");
		lsEstado.add(estadoTodos);

		lsEstado.addAll(estadoService.obtenerTodos());
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		Relatorio relatorio;

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

		Timestamp dataInicio = new Timestamp((DateUtil.inicioFecha((java.util.Date) this.datInicial.getValue()).getTime()));
		Timestamp dataFinal = new Timestamp((DateUtil.fimFecha((java.util.Date) this.datFinal.getValue()).getTime()));

		parametros.put("DATA_INICIAL", dataInicio);
		parametros.put("DATA_FINAL", dataFinal);

		Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
		Estado estado = (Estado) cmbEstado.getSelectedItem().getValue();
		Aidf aidf = null;
		if (cmbAidf.getSelectedItem() != null) {
			aidf = (Aidf) cmbAidf.getSelectedItem().getValue();
		}
		Boolean somenteCancelado = ckbSomenteCancelado.isChecked();

		Radio radio = rdgInterestadualMunicial.getSelectedItem();
		String tipoLinha = StringUtils.EMPTY;
		if (radio.getValue().equals("0")) {
			tipoLinha = "INTERESTADUAL";
		} else if (radio.getValue().equals("1")) {
			tipoLinha = "INTERMUNICIPAL";
		} else if (radio.getValue().equals("2")) {
			tipoLinha = "TODOS";
		}

		Radio rdEsp = rdEspecie.getSelectedItem();
		String especie;
		if (rdEsp.getValue().equals("0")) {
			especie = "Bilhetes BPR";
		} else {
			especie = "Excesso de Bagagem(EB)";
		}
		parametros.put("AIDF", aidf);
		parametros.put("ESTADO_ID", estado.getEstadoId());
		parametros.put("ESTADO", estado.getNombestado());
		parametros.put("TIPO_LINHA", tipoLinha);
		parametros.put("SOMENTE_CANCELADO", somenteCancelado);
		parametros.put("ESPECIE", especie);

		if (empresa != null) {
			parametros.put("EMPRESA", empresa.getNombempresa());
			parametros.put("EMPRESA_ID", empresa.getEmpresaId());
		} else {
			parametros.put("EMPRESA", "TODOS");
		}
		parametros.put("TITULO", Labels.getLabel("relatorioDocumentosFiscaisController.window.title"));
		Radio radioAgrupamento = rdTipoAgrupamento.getSelectedItem();
		if (radioAgrupamento.getValue().equals("0")) {
			relatorio = new RelatorioDocumentosFiscais(parametros, dataSourceRead.getConnection());
		} else {
			relatorio = new RelatorioDocumentosFiscaisAgrupadoPorLocalidade(parametros, dataSourceRead.getConnection());
		}
		Map args = new HashMap();
		args.put("relatorio", relatorio);

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

	private void buscaAidf() {
		Empresa empresa = null;
		Estado estado = null;

		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		Comboitem itemEstado = cmbEstado.getSelectedItem();

		if (itemEmpresa != null) {
			empresa = (Empresa) itemEmpresa.getValue();
		}
		if (itemEstado != null) {
			estado = (Estado) itemEstado.getValue();
		}

		if (itemEmpresa != null && itemEstado != null) {
			lsAidf = aidfService.buscaAidfEstadoEmpresa(empresa.getEmpresaId(), estado.getEstadoId(), false);

			ComboitemRenderer aidfRenderer = new ComboitemRenderer() {
				public void render(Comboitem item, Object data) {
					if (data instanceof Aidf) {
						Aidf aidf = (Aidf) data;
						item.setLabel(aidf.getDocfiscal() + " = " + aidf.getForminicial() + "-" + aidf.getFormfinal());
					} else {
						item.setLabel(Objects.toString(data));
					}
					item.setValue(data);
				}
			};
			cmbAidf.setItemRenderer(aidfRenderer);
			cmbAidf.setModel(new BindingListModelList(lsAidf, true));
		}
	}

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

	public void onSelect$cmbEstado(Event ev) {
		buscaAidf();
	}

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

	public List<Estado> getLsEstado() {
		return lsEstado;
	}

	public void setLsEstado(List<Estado> lsEstado) {
		this.lsEstado = lsEstado;
	}

	public List<Aidf> getLsAidf() {
		return lsAidf;
	}

	public void setLsAidf(List<Aidf> lsAidf) {
		this.lsAidf = lsAidf;
	}

	public List<Aidf> getAidfList() {
		return aidfList;
	}

	public void setAidfList(List<Aidf> aidfList) {
		this.aidfList = aidfList;
	}
}
