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

import java.util.Date;
import java.util.List;

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.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Filedownload;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.service.BpeService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.vo.bpe.BPeVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("extrairBpeXmlController")
@Scope("prototype")
public class ExtrairBpeXmlController extends MyGenericForwardComposer {
	
	private static Logger log = LogManager.getLogger(ExtrairBpeXmlController.class);

	private static final long serialVersionUID = 1L;

	private Datebox dtInicio;
	private Datebox dtFim;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbEstado;
	private Combobox cmbPuntoVenta;

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

	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private EstadoService estadoService;
	@Autowired
	private BpeService bpeService;

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

	private void extrairBpeXml() throws Exception {
		if (!validar()) {
			return;
		}

		try {
			
			Integer empresaId = null;
			Date dataVendaInicio = null;
			Date dataVendaFim = null;
			Integer estadoId = null;
			
			if (dtInicio.getValue() != null && dtFim.getValue() != null) {
				dataVendaInicio = dtInicio.getValue();
				dataVendaFim = dtFim.getValue();
			}
	
			Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
			if (itemEmpresa != null) {
				Empresa empresa = (Empresa) itemEmpresa.getValue();
				empresaId = empresa.getEmpresaId();
			}
			
			Comboitem itemEstado = cmbEstado.getSelectedItem();
			if (itemEstado != null) {
				Estado estado = (Estado) itemEstado.getValue();
				estadoId = estado.getEstadoId();
			}
			
			List<BPeVO> bpes = bpeService.buscarBPeVendaEEventosAutorizados(empresaId, dataVendaInicio, dataVendaFim, estadoId);
			if(bpes == null || bpes.isEmpty()) {
				Messagebox.show(Labels.getLabel("extrairBpeXmlController.MSG.nenhumaInformacao"),
						Labels.getLabel("extrairBpeXmlController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			byte[] arquivoCompactado = bpeService.extrairXmlsBPe(bpes);
			String dataInicial = DateUtil.getStringDate(dataVendaInicio, "yyyy-MM-dd");
			String dataFinal = DateUtil.getStringDate(dataVendaFim, "yyyy-MM-dd");
			String nomearquivo = "BPe_Dump_" + dataInicial + "_" + dataFinal + ".zip";
			
			Filedownload.save(arquivoCompactado, "application/x-download", nomearquivo);
		
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
	}

	private boolean validar() {
		try {
			if (dtInicio.getValue() == null || dtFim.getValue() == null) {
				Messagebox.show(Labels.getLabel("relatorioBPeController.MSG.informarData"),
						Labels.getLabel("extrairBpeXmlController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return false;
			}
			
			if(dtInicio.getValue().after(dtFim.getValue())){
				Messagebox.show(Labels.getLabel("relatorioBPeController.MSG.dataInicialMaiorQueFinal"),
						Labels.getLabel("extrairBpeXmlController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return false;
			}
			
			Integer difDias = DateUtil.getElapsedDias(dtInicio.getValue(), dtFim.getValue());
			if(difDias >= 7) {
				Messagebox.show(Labels.getLabel("extrairBpeXmlController.MSG.limiteDias"),
						Labels.getLabel("extrairBpeXmlController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return false;
			}
			
		} catch (InterruptedException ex) {
			return false;
		}
		return true;
	}

	public void onClick$btnExtrairBpeXml(Event ev) throws Exception {
		extrairBpeXml();
	}

	public Datebox getDtInicio() {
		return dtInicio;
	}

	public void setDtInicio(Datebox dtInicio) {
		this.dtInicio = dtInicio;
	}

	public Datebox getDtFim() {
		return dtFim;
	}

	public void setDtFim(Datebox dtFim) {
		this.dtFim = dtFim;
	}

	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

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

	public Combobox getCmbPuntoVenta() {
		return cmbPuntoVenta;
	}

	public void setCmbPuntoVenta(Combobox cmbPuntoVenta) {
		this.cmbPuntoVenta = cmbPuntoVenta;
	}

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

}
