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

import java.sql.SQLException;
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.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.lang.Objects;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
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 com.rjconsultores.ventaboletos.entidad.Aidf;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioFolioRmd;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioImpressaoRmd;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioImpressaoRmdBpr;
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.service.FiscalService;
import com.rjconsultores.ventaboletos.utilerias.impressaormd.vo.ImpressaoRMD;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;

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

	private static Logger log = LogManager.getLogger(BusquedaImpressaoRMDController.class);

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private FiscalService fiscalService;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private EstadoService estadoService;

	@Autowired
	private AidfService aidfService;

	private List<Empresa> lsEmpresa;
	private List<Estado> lsEstado;
	private List<Aidf> lsAidf;

	private Datebox datInicial;
	private Datebox datFinal;
	private MyTextbox folioInicial;
	private MyTextbox folioFim;

	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbEstado;
	private MyComboboxEstandar cmbAidf;

	private Radio radBPR;
	private Radio radECF;
	private Checkbox tipoLayout;

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

		super.doAfterCompose(comp);
	}

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

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

	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(), true);

			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 onSelect$cmbAidf(Event ev) {

		Empresa empresa = cmbEmpresa.getSelectedItem() == null ? null : (Empresa) cmbEmpresa.getSelectedItem().getValue();
		Estado estado = cmbEstado.getSelectedItem() == null ? null : (Estado) cmbEstado.getSelectedItem().getValue();
		Aidf aidf = cmbAidf.getSelectedItem() == null ? null : (Aidf) cmbAidf.getSelectedItem().getValue();
		if (aidf != null) {
			String ultimoRmdUtilizado = aidfService.buscaUltimoAidfRMDUtilizado(aidf.getAidfId(), empresa.getEmpresaId(), estado.getEstadoId());
			if (StringUtils.isNotBlank(ultimoRmdUtilizado)) {
				folioInicial.setValue(ultimoRmdUtilizado);
			} else {
				folioInicial.setValue(aidf.getForminicial() == null ? "" : aidf.getForminicial());
			}
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarImpressao(boolean isView, boolean isExecutarRmd, boolean isCancelarRmd, boolean isInativarRmd) throws InterruptedException {

		Empresa empresa = cmbEmpresa.getSelectedItem() == null ? null : (Empresa) cmbEmpresa.getSelectedItem().getValue();
		Estado estado = cmbEstado.getSelectedItem() == null ? null : (Estado) cmbEstado.getSelectedItem().getValue();
		Aidf aidf = cmbAidf.getSelectedItem() == null ? null : (Aidf) cmbAidf.getSelectedItem().getValue();

		if (empresa != null && estado != null) {
			try {
				String rmd = null;
				if (aidf != null) {
					rmd = aidf.getDocfiscal();
				} else {
					Messagebox.show(Labels.getLabel("busquedaImpressaoRMDController.select.RMD"),
							Labels.getLabel("busquedaImpressaoRMDController.mnImpressaoRMD.label"),
							Messagebox.OK, Messagebox.INFORMATION);
					return;
				}

				String inicioRmd = folioInicial.getValue();
				if (StringUtils.isBlank(inicioRmd)) {
					Messagebox.show(
							Labels.getLabel("busquedaImpressaoRMDController.select.RMD"),
							Labels.getLabel("busquedaImpressaoRMDController.mnImpressaoRMD.label"),
							Messagebox.OK, Messagebox.INFORMATION);
					return;
				} else if (!(isCancelarRmd || isInativarRmd) && !aidfService.vaidaRMDUtilizado(aidf.getAidfId(), empresa.getEmpresaId(), estado.getEstadoId(), inicioRmd)) {
					Messagebox.show(
							"Folio já utilizado.",
							Labels.getLabel("busquedaImpressaoRMDController.mnImpressaoRMD.label"),
							Messagebox.OK, Messagebox.INFORMATION);
					return;
				}

				List<ImpressaoRMD> list = null;
				if (!isCancelarRmd && !isInativarRmd && radBPR.isChecked()) {
					list = fiscalService.getRegistroImpressaoRMDTipoBPR(datInicial.getValue(), datFinal.getValue(),
							empresa, estado, rmd, inicioRmd);
				} else if (!isCancelarRmd && !isInativarRmd && radECF.isChecked()) {
					list = fiscalService.getRegistroImpressaoRMDTipoECF(datInicial.getValue(), datFinal.getValue(),
							empresa, estado, rmd, inicioRmd);
				}

				if (isExecutarRmd)
					fiscalService.gravarRMDBoleto(list, aidf, inicioRmd, empresa, estado, radECF.isChecked(), radBPR.isChecked());

				String fimRmd = folioFim == null ? null : folioFim.getValue();
				if (isCancelarRmd || isInativarRmd) {

					if (StringUtils.isBlank(fimRmd))
						fimRmd = inicioRmd;

					fiscalService.cancelarRMDBoleto(datInicial.getValue(), datFinal.getValue(), empresa, estado, aidf, inicioRmd, fimRmd,
							isCancelarRmd, isInativarRmd, radECF.isChecked(), radBPR.isChecked());

					String msgRmd = isCancelarRmd ? Labels.getLabel("busquedaImpressaoRMDController.cancel.msg") : Labels.getLabel("busquedaImpressaoRMDController.inactivo.msg");

					Messagebox.show(msgRmd, Labels.getLabel("busquedaImpressaoRMDController.mnImpressaoRMD.label"),
							Messagebox.OK, Messagebox.INFORMATION);

					limparFiltro();
					return;
				}

				if (!isCancelarRmd) {
					Map<String, Object> parametros = new HashMap<String, Object>();
					parametros.put("list", list);

					Relatorio relatorio = null;
					if (tipoLayout.isChecked()) {
						relatorio = new RelatorioImpressaoRmd(parametros, dataSourceRead.getConnection());
					} else {
						relatorio = new RelatorioImpressaoRmdBpr(parametros, dataSourceRead.getConnection());
					}

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

					openWindow("/component/reportView.zul",
							Labels.getLabel("indexController.mnImpressaoRMD.label"), args, MODAL);
				}

				if (isExecutarRmd)
					limparFiltro();

			} catch (InterruptedException e) {
				log.error("", e);
			} catch (WrongValueException e) {
				log.error("", e);
			} catch (SQLException e) {
				log.error("", e);
			} catch (Exception e) {
				log.error("", e);

				Messagebox.show(e.getMessage(),
						Labels.getLabel("indexController.mnImpressaoRMD.label"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
		}
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void onClick$btnReporte(Event ev) throws SQLException, Exception {

		Empresa empresa = cmbEmpresa.getSelectedItem() == null ? null : (Empresa) cmbEmpresa.getSelectedItem().getValue();
		Estado estado = cmbEstado.getSelectedItem() == null ? null : (Estado) cmbEstado.getSelectedItem().getValue();
		Aidf aidf = cmbAidf.getSelectedItem() == null ? null : (Aidf) cmbAidf.getSelectedItem().getValue();

		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("empresa", empresa);
		parametros.put("estado", estado);
		parametros.put("aidf", aidf);
		parametros.put("dataInicial", datInicial.getValue());
		parametros.put("dataFinal", datFinal.getValue());

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

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

		openWindow("/component/reportView.zul",
				Labels.getLabel("indexController.mnImpressaoRMD.label"), args, MODAL);
	}

	public void onClick$btnView(Event ev) throws InterruptedException {
		executarImpressao(true, false, false, false);
	}

	public void onClick$btnExecutar(Event ev) throws InterruptedException {
		executarImpressao(false, true, false, false);
	}

	public void onClick$btnCancelar(Event ev) throws InterruptedException {
		executarImpressao(false, false, true, false);
	}

	public void onClick$btnInativar(Event ev) throws InterruptedException {
		executarImpressao(false, false, false, true);
	}

	private void limparFiltro() {
		folioInicial.setValue(null);
		folioFim.setValue(null);

		cmbEmpresa.setSelectedItem(null);
		cmbEstado.setSelectedItem(null);
		cmbAidf.setSelectedItem(null);

		lsAidf = new ArrayList<Aidf>();
	}

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

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

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

}
