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

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
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.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Mensaje;
import com.rjconsultores.ventaboletos.entidad.MensajeEmpresa;
import com.rjconsultores.ventaboletos.entidad.MensajePuntoVenta;
import com.rjconsultores.ventaboletos.entidad.MensajeUsuario;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.MensajeEmpresaService;
import com.rjconsultores.ventaboletos.service.MensajePuntaVentaService;
import com.rjconsultores.ventaboletos.service.MensajeService;
import com.rjconsultores.ventaboletos.service.MensajeUsuarioService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderMensajeEmpresa;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderMensajePuntoVenta;

@Controller("editarMensajeController")
@Scope("prototype")
public class EditarMensajeController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(EditarMensajeController.class);

	@Autowired
	private MensajePuntaVentaService mensajePuntoVentaService;
	@Autowired
	private MensajeEmpresaService mensajeEmpresaVentaService;
	@Autowired
	private MensajeUsuarioService mensajeUsuarioService;
	@Autowired
	private MensajeService mensajeService;
	@Autowired
	private EmpresaService empresaService;

	private Mensaje mensaje;
	private Datebox txtDataInicial;
	private Datebox txtDataFinal;
	private Textbox txtDescricao;
	private Checkbox chcTipo;

	private List<MensajeEmpresa> mensajeEmpresaToUpdate;
	private Combobox cmbEmpresa;
	private List<Empresa> lsEmpresa;
	private List<MensajeEmpresa> lsAddEmpresa;
	private MyListbox empresaList;

	private List<MensajePuntoVenta> mensajePuntoVentasToUpdate;
	private Combobox cmbPuntoVenta;
	private List<MensajePuntoVenta> lsAddPuntoVenta;
	private MyListbox puntoVentaList;

	private String descricaoOriginal;
	BusquedaMensajeController busquedaMensajeController;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		busquedaMensajeController = (BusquedaMensajeController) Executions.getCurrent().getArg().get("busquedaMensajeController");

		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsEmpresa.add(getEmpresaTodas());

		mensajeEmpresaToUpdate = new ArrayList<MensajeEmpresa>();
		mensajePuntoVentasToUpdate = new ArrayList<MensajePuntoVenta>();

		mensaje = (Mensaje) Executions.getCurrent().getArg().get("mensaje");

		if (mensaje.getMensajesEmpresa() == null) {
			mensaje.setMensajesEmpresa(new ArrayList<MensajeEmpresa>());
		}
		if (mensaje.getMensajesPuntoVenda() == null) {
			mensaje.setMensajesPuntoVenda(new ArrayList<MensajePuntoVenta>());
		}

		super.doAfterCompose(comp);

		if (mensaje.getMensajeId() != null) {
			descricaoOriginal = mensaje.getDescripcion();
			chcTipo.setChecked(mensaje.getIndTipo());
			mensaje.setMensajesPuntoVenda(mensajePuntoVentaService.obtenerPorMensaje(mensaje));
			mensaje.setMensajesEmpresa(mensajeEmpresaVentaService.obtenerPorMensaje(mensaje));
			mensaje.setMensajesUsuario(mensajeUsuarioService.obtenerPorMensaje(mensaje));
		}

		lsAddPuntoVenta = mensaje.getMensajesPuntoVenda();
		lsAddEmpresa = mensaje.getMensajesEmpresa();

		empresaList.setItemRenderer(new RenderMensajeEmpresa());
		puntoVentaList.setItemRenderer(new RenderMensajePuntoVenta());

		empresaList.setData(lsAddEmpresa);
		puntoVentaList.setData(lsAddPuntoVenta);
	}

	private Empresa getEmpresaTodas() {
		return empresaService.obtenerID(-1);
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException, ParseException {
		txtDataFinal.getValue();
		txtDataInicial.getValue();
		txtDescricao.getValue();

		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		Date dataAtual = format.parse(format.format(new Date()));
		
		validarListaTodos();

		if (mensaje.getMensajeId() == null &&
				mensaje.getFecFin().before(dataAtual)) {
			Messagebox.show(
					Labels.getLabel("editarMensajeController.MSG.dataFinalMenorDataAtual"),
					Labels.getLabel("editarMensajeController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		if (mensaje.getFecFin().before(mensaje.getFecIni())) {
			Messagebox.show(
					Labels.getLabel("editarMensajeController.MSG.dataFinalMenorDataInicial"),
					Labels.getLabel("editarMensajeController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		if (empresaList.getItemCount() == 0 && puntoVentaList.getItemCount() == 0) {
			Messagebox.show(
					Labels.getLabel("editarMensajeController.MSG.informarEmpresaPuntoVenta"),
					Labels.getLabel("editarMensajeController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		if (mensaje.getMensajeId() != null
				&& !mensaje.getDescripcion().equals(descricaoOriginal)
				&& mensaje.getFecFin().before(dataAtual)) {
			Messagebox.show(
					Labels.getLabel("editarMensajeController.MSG.alteracaoNaoPermitida"),
					Labels.getLabel("editarMensajeController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}

		mensaje.setIndTipo(chcTipo.isChecked());
		mensaje.setActivo(true);
		mensaje.setFecModif(new Date());
		mensaje.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

		if (mensaje.getMensajeId() != null
				&& !mensaje.getDescripcion().equals(descricaoOriginal)) {
			for (MensajeUsuario mu : mensaje.getMensajesUsuario()) {
				mu.setFecModif(new Date());
				mu.setUsuarioModifId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				mu.setFecLeido(null);
			}
		}

		try {
			mensajeService.suscribirActualizar(mensaje);

			Messagebox.show(
					Labels.getLabel("editarMensajeController.MSG.suscribirOK"),
					Labels.getLabel("editarMensajeController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			busquedaMensajeController.refreshLista(false);
			closeWindow();

		} catch (Exception e) {
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarMensajeController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			log.error("", e);
		}
	}

	private void validarListaTodos() {
		MensajeEmpresa empresaTodas = null;

		for (MensajeEmpresa empresa : lsAddEmpresa) {
			if (empresa.getEmpresa().getEmpresaId().equals(-1)) {
				empresaTodas = empresa;
				break;
			}
		}
		if (empresaTodas != null) {
			lsAddEmpresa.clear();
			lsAddEmpresa.add(empresaTodas);
		}

		MensajePuntoVenta puntoVentaTodas = null;
		
		for(MensajePuntoVenta puntoVenta : lsAddPuntoVenta){
			if(puntoVenta.getPuntoVenda().getPuntoventaId().equals(-1)){
				puntoVentaTodas = puntoVenta;
				break;
			}
		}
		
		if(puntoVentaTodas != null){
			lsAddPuntoVenta.clear();
			lsAddPuntoVenta.add(puntoVentaTodas);
		}
	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		try {
			int opcao = Messagebox.show(
					Labels.getLabel("editarMensajeController.btnApagar.MSG.desejaApagarMensagem"),
					Labels.getLabel("editarMensajeController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (opcao == Messagebox.YES) {
				mensaje.setFecModif(new Date());
				mensaje.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				mensajeService.borrar(mensaje);

				Messagebox.show(
						Labels.getLabel("editarMensajeController.btnApagar.MSG.borrarOK"),
						Labels.getLabel("editarMensajeController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				busquedaMensajeController.refreshLista(false);
				closeWindow();
			}

		} catch (Exception ex) {
			log.error("", ex);

			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarAidfController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}

	}

	public void onClick$btnAdicionarEmpresa(Event ev) {
		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();
			MensajeEmpresa me = new MensajeEmpresa();
			Boolean existe = false;

			for (MensajeEmpresa m : lsAddEmpresa) {
				if (m.getEmpresa().equals(empresa)) {
					existe = true;
					break;
				}
			}

			if (!existe) {
				me.setActivo(true);
				me.setEmpresa(empresa);
				me.setFecModif(new Date());
				me.setMensaje(mensaje);
				me.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				lsAddEmpresa.add(me);
				empresaList.setData(lsAddEmpresa);
			}

			cmbEmpresa.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverEmpresa(Event ev) {
		MensajeEmpresa selected = (MensajeEmpresa) empresaList.getSelected();
		MensajeEmpresa toRemove = null;
		if (selected != null) {
			for (MensajeEmpresa m : lsAddEmpresa) {
				if (m.getEmpresa().equals(selected.getEmpresa())) {
					toRemove = m;
				}
			}

			if (toRemove == null) {
				return;
			} else if (toRemove.getMensajeEmpresaId() != null) {
				toRemove.setActivo(false);
				toRemove.setFecModif(new Date());
				toRemove.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				mensajeEmpresaToUpdate.add(toRemove);
			}
			lsAddEmpresa.remove(toRemove);
			empresaList.setData(lsAddEmpresa);
		}
	}

	public void onClick$btnAdicionarPuntoVenta(Event ev) {
		Comboitem cbiPuntoVenta = cmbPuntoVenta.getSelectedItem();
		if (cbiPuntoVenta != null) {
			PuntoVenta puntoVenta = (PuntoVenta) cbiPuntoVenta.getValue();
			MensajePuntoVenta mp = new MensajePuntoVenta();
			Boolean existe = false;

			for (MensajePuntoVenta m : lsAddPuntoVenta) {
				if (m.getPuntoVenda().equals(puntoVenta)) {
					existe = true;
					break;
				}
			}

			if (!existe) {
				mp.setActivo(true);
				mp.setPuntoVenda(puntoVenta);
				mp.setFecModif(new Date());
				mp.setMensaje(mensaje);
				mp.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				lsAddPuntoVenta.add(mp);
				puntoVentaList.setData(lsAddPuntoVenta);
			}

			cmbPuntoVenta.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverPuntoVenta(Event ev) {
		MensajePuntoVenta selected = (MensajePuntoVenta) puntoVentaList.getSelected();
		MensajePuntoVenta toRemove = null;
		if (selected != null) {
			for (MensajePuntoVenta m : lsAddPuntoVenta) {
				if (m.getPuntoVenda().equals(selected.getPuntoVenda())) {
					toRemove = m;
				}
			}

			if (toRemove == null) {
				return;
			} else if (toRemove.getMensajePuntoVendaId() != null) {
				toRemove.setActivo(false);
				toRemove.setFecModif(new Date());
				toRemove.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				mensajePuntoVentasToUpdate.add(toRemove);
			}
			lsAddPuntoVenta.remove(toRemove);
			puntoVentaList.setData(lsAddPuntoVenta);
		}
	}

	public Mensaje getMensaje() {
		return mensaje;
	}

	public void setMensaje(Mensaje mensaje) {
		this.mensaje = mensaje;
	}

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

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

	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

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

	public MyListbox getEmpresaList() {
		return empresaList;
	}

	public void setEmpresaList(MyListbox empresaList) {
		this.empresaList = empresaList;
	}

	public Combobox getCmbPuntoVenta() {
		return cmbPuntoVenta;
	}

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

	public MyListbox getPuntoVentaList() {
		return puntoVentaList;
	}

	public void setPuntoVentaList(MyListbox puntoVentaList) {
		this.puntoVentaList = puntoVentaList;
	}

	public Datebox getTxtDataInicial() {
		return txtDataInicial;
	}

	public void setTxtDataInicial(Datebox txtDataInicial) {
		this.txtDataInicial = txtDataInicial;
	}

	public Datebox getTxtDataFinal() {
		return txtDataFinal;
	}

	public void setTxtDataFinal(Datebox txtDataFinal) {
		this.txtDataFinal = txtDataFinal;
	}

	public Textbox getTxtDescricao() {
		return txtDescricao;
	}

	public void setTxtDescricao(Textbox txtDescricao) {
		this.txtDescricao = txtDescricao;
	}

	public Checkbox getChcTipo() {
		return chcTipo;
	}

	public void setChcTipo(Checkbox chcTipo) {
		this.chcTipo = chcTipo;
	}

}
