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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

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.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.Textbox;

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.vo.bpe.BPeVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderBpe;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEstadoUf;

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

	private static final long serialVersionUID = 1L;

	private Datebox dtInicio;
	private Datebox dtFim;
	private MyComboboxEstandar cmbEmpresa;
	private Combobox cmbPuntoVenta;
	private MyListbox estadoList;
	private Textbox txtChBpe;
	private Textbox txtNumBpe;
	private Textbox txtCodigoRejeicao;

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

	@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);
		
		estadoList.setItemRenderer(new RenderEstadoUf());
		estadoList.setData(lsEstado);
		
		bpeReenvioList.setItemRenderer(new RenderBpe());
		bpeReenvioList.setData(new ArrayList<BPeVO>());
	}

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

		Integer empresaId = null;
		Date dataVendaInicio = null;
		Date dataVendaFim = null;
		String chbpe = null;
		String numbpe = null;
		List<Integer> estados = new ArrayList<Integer>();
		List<String> codigosRejeicoes = new ArrayList<String>();
		
		if (dtInicio.getValue() != null && dtFim.getValue() != null) {
			dataVendaInicio = dtInicio.getValue();
			dataVendaFim = dtFim.getValue();
		}

		List<Object> lsEstadosSelecionados = estadoList.getItensSelecionados();
		
		if (!lsEstadosSelecionados.isEmpty()) {
			for (int i = 0; i < lsEstadosSelecionados.size(); i++) {
				Estado estado = (Estado) lsEstadosSelecionados.get(i);
				estados.add(estado.getEstadoId());
			}
		}

		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			empresaId = empresa.getEmpresaId();
		}
		
		txtChBpe.getValue();
		if(StringUtils.isNotBlank(txtChBpe.getValue())) {
			chbpe = txtChBpe.getValue();
		}

		txtNumBpe.getValue();
		if(StringUtils.isNotBlank(txtNumBpe.getValue())) {
			numbpe = txtNumBpe.getValue();
		}
		
		txtCodigoRejeicao.getValue();
		if(StringUtils.isNotBlank(txtCodigoRejeicao.getValue())) {
			codigosRejeicoes = Arrays.asList(txtCodigoRejeicao.getValue().split(";"));
		}
		
		List<BPeVO> lsBpes = bpeService.buscarBPeRejeitadosContingencia(empresaId, numbpe, chbpe, dataVendaInicio, dataVendaFim, estados, codigosRejeicoes);
		if(lsBpes == null || lsBpes.isEmpty()) {
			Messagebox.show(Labels.getLabel("reenvioBpeController.MSG.bpeNaoLocalizado"),
					Labels.getLabel("reenvioBpeController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}
		bpeReenvioList.setData(lsBpes);
		
	}

	private boolean validar() {
		try {
			txtChBpe.getValue();
			txtNumBpe.getValue();
			
			boolean isFiltroChbpeOrNumbpe = StringUtils.isNotBlank(txtChBpe.getValue()) || StringUtils.isNotBlank(txtNumBpe.getValue());
			
			if(!isFiltroChbpeOrNumbpe) {
				if (dtInicio.getValue() == null || dtFim.getValue() == null) {
					Messagebox.show(Labels.getLabel("relatorioBPeController.MSG.informarData"),
							Labels.getLabel("reenvioBpeController.window.title"),
							Messagebox.OK, Messagebox.INFORMATION);
					return false;
				}
				
				if(dtInicio.getValue().after(dtFim.getValue())){
					Messagebox.show(Labels.getLabel("relatorioBPeController.MSG.dataInicialMaiorQueFinal"),
							Labels.getLabel("reenvioBpeController.window.title"),
							Messagebox.OK, Messagebox.INFORMATION);
					return false;
				}
			}
			
		} catch (InterruptedException ex) {
			return false;
		}
		return true;
	}

	public void onClick$btnBuscarBpe(Event ev) throws Exception {
		buscarBpeReenvio();
	}
	
	public void onClick$btnReenviarBpe(Event ev) throws Exception {
		try {
			List<BPeVO> bpesSelecionados = bpeReenvioList.getItensSelecionados(BPeVO.class);
			if(bpesSelecionados == null || bpesSelecionados.isEmpty()) {
				Messagebox.show(Labels.getLabel("reenvioBpeController.MSG.bpeNaoSelecionados"),
						Labels.getLabel("reenvioBpeController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
				return;				
			}
			bpeService.definirBPeRejeitadoSefazReenvio(bpesSelecionados);
			Messagebox.show(Labels.getLabel("reenvioBpeController.MSG.bpeDefinidosReenvio"),
					Labels.getLabel("reenvioBpeController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			
			bpeReenvioList.clearSelection();
			bpeReenvioList.clear();
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}

	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 MyListbox getEstadoList() {
		return estadoList;
	}

	public void setEstadoList(MyListbox estadoList) {
		this.estadoList = estadoList;
	}

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

}
