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

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

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

import com.rjconsultores.ventaboletos.entidad.ConfRestricaoCanalVenta;
import com.rjconsultores.ventaboletos.entidad.ConfRestricaoExcecao;
import com.rjconsultores.ventaboletos.entidad.ConfRestricaoPtovta;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ConfRestricaoCanalVentaService;
import com.rjconsultores.ventaboletos.service.ConfRestricaoExcecaoService;
import com.rjconsultores.ventaboletos.service.ConfRestricaoPtovtaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfRestricaoExcecao;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfRestricaoPtovta;

@Controller("editarConfRestricaoCanalVentaController")
@Scope("prototype")
public class EditarConfRestricaoCanalVentaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private ConfRestricaoCanalVentaService confRestricaoCanalVentaService;
	@Autowired
	private TipoPuntoVentaService tipoPtoVtaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private ConfRestricaoExcecaoService confRestricaoExcecaoServide;
	@Autowired
	private ConfRestricaoPtovtaService confRestricaoPtovtaService;

	private ConfRestricaoCanalVenta confRestricaoCanalVenta;
	private List<TipoPuntoVenta> lsTipoPtoVta;
	private List<Ruta> lsRuta;
	private MyListbox confRestricaoCanalVentaList;
	private MyListbox excecaoDataList;
	private Button btnApagar;
	private MyComboboxParada cmbOrigen;
	private MyComboboxParada cmbDestino;
	private Combobox cmbRuta;
	private Combobox cmbTipoPtoVta;
	private Datebox dtExcecaoServicio;

	private MyComboboxPuntoVenta cmbPuntoVenta;
	private MyListbox confRestricaoPtovtaDataList;

	public ConfRestricaoCanalVenta getConfRestricaoCanalVenta() {
		return confRestricaoCanalVenta;
	}

	public void setConfRestricaoCanalVenta(ConfRestricaoCanalVenta confRestricaoCanalVenta) {
		this.confRestricaoCanalVenta = confRestricaoCanalVenta;
	}

	public List<TipoPuntoVenta> getLsTipoPtoVta() {
		return lsTipoPtoVta;
	}

	public void setLsTipoPtoVta(List<TipoPuntoVenta> lsTipoPtoVta) {
		this.lsTipoPtoVta = lsTipoPtoVta;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		confRestricaoCanalVenta = (ConfRestricaoCanalVenta) Executions.getCurrent().getArg().get("confRestricaoCanalVenta");
		confRestricaoCanalVentaList = (MyListbox) Executions.getCurrent().getArg().get("confRestricaoCanalVentaList");

		lsTipoPtoVta = tipoPtoVtaService.obtenerTodos();
		lsRuta = rutaService.obtenerTodos();

		super.doAfterCompose(comp);

		if (confRestricaoCanalVenta.getConfRestricaoCanalVentaId() == null) {
			btnApagar.setVisible(Boolean.FALSE);

			List<ConfRestricaoPtovta> lsPtovta = new ArrayList<ConfRestricaoPtovta>();
			lsPtovta.add(confRestricaoPtovtaService.obtenerPtovtaTodos());
			confRestricaoCanalVenta.setLsConfRestricaoPtovta(lsPtovta);
			confRestricaoPtovtaDataList.setData(lsPtovta);

		} else {
			confRestricaoCanalVenta = confRestricaoCanalVentaService.obtenerID(confRestricaoCanalVenta.getConfRestricaoCanalVentaId());
			excecaoDataList.setData(confRestricaoCanalVenta.getLsConfRestricaoExcecao());
			confRestricaoPtovtaDataList.setData(confRestricaoCanalVenta.getLsConfRestricaoPtovta());
		}

		excecaoDataList.setItemRenderer(new RenderConfRestricaoExcecao());
		confRestricaoPtovtaDataList.setItemRenderer(new RenderConfRestricaoPtovta());

	}

	public List<Ruta> getLsRuta() {
		return lsRuta;
	}

	public void setLsRuta(List<Ruta> lsRuta) {
		this.lsRuta = lsRuta;
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {

		try {
			// Isso se faz necessário quando o usuário "deseleciona" uma ruta. Essa alteração não estava afetando o bean
			if (cmbRuta.getSelectedItem() == null) {
				confRestricaoCanalVenta.setRuta(null);
				cmbOrigen.getValue(true);
				cmbDestino.getValue(true);
			}
			if (cmbOrigen.getSelectedItem() == null) {
				confRestricaoCanalVenta.setOrigem(null);
			} else {
				confRestricaoCanalVenta.setOrigem((Parada) cmbOrigen.getSelectedItem().getValue());
			}
			if (cmbDestino.getSelectedItem() == null) {
				confRestricaoCanalVenta.setDestino(null);
			} else {
				confRestricaoCanalVenta.setDestino((Parada) cmbDestino.getSelectedItem().getValue());
			}
			if (cmbTipoPtoVta.getSelectedItem() == null) {
				confRestricaoCanalVenta.setTipoPuntoVenta(null);
			}

			if (!confRestricaoCanalVenta.getLsConfRestricaoPtovta().isEmpty()) {
				for (ConfRestricaoPtovta cre : confRestricaoCanalVenta.getLsConfRestricaoPtovta()) {
					cre.setConfRestricaoCanalVenta(confRestricaoCanalVenta);
				}
			}

			confRestricaoCanalVentaService.suscribirActualizar(confRestricaoCanalVenta);
			confRestricaoCanalVentaList.updateItem(confRestricaoCanalVenta);

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

			closeWindow();

		} catch (BusinessException e) {
			Messagebox.show(
					e.getMessage(),
					Labels.getLabel("editarConfRestricaoCanalVentaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		Integer resp = Messagebox.show(
				Labels.getLabel("editarConfRestricaoCanalVentaController.MSG.borrarPergunta"),
				Labels.getLabel("editarConfRestricaoCanalVentaController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp.equals(Messagebox.YES)) {
			confRestricaoCanalVentaService.borrar(confRestricaoCanalVenta);

			Messagebox.show(
					Labels.getLabel("editarConfRestricaoCanalVentaController.MSG.borrarOK"),
					Labels.getLabel("editarConfRestricaoCanalVentaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			confRestricaoCanalVentaList.removeItem(confRestricaoCanalVenta);

			closeWindow();
		}
	}

	public void onClick$btnAddRestricaoPtovta(Event ev) throws InterruptedException {

		if (cmbPuntoVenta.getSelectedItem() != null) {
			PuntoVenta pv = (PuntoVenta) cmbPuntoVenta.getSelectedItem().getValue();
			ConfRestricaoPtovta ptovta = new ConfRestricaoPtovta();
			ptovta.setPuntoVenta(pv);
			ptovta.setConfRestricaoCanalVenta(confRestricaoCanalVenta);
			ptovta.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			ptovta.setFecmodif(Calendar.getInstance().getTime());
			ptovta.setActivo(Boolean.TRUE);

			if (confRestricaoCanalVenta.getLsConfRestricaoPtovta() == null) {
				confRestricaoCanalVenta.setLsConfRestricaoPtovta(new ArrayList<ConfRestricaoPtovta>());
			}
			
			boolean ptovtaJaCadastrado = false;
			for (ConfRestricaoPtovta pt : confRestricaoCanalVenta.getLsConfRestricaoPtovta()){
				if (pt.getPuntoVenta().equals(pv)){
					ptovtaJaCadastrado = true;
					break;
				}
			}
			
			if (!ptovtaJaCadastrado){
				confRestricaoCanalVenta.getLsConfRestricaoPtovta().add(ptovta);
				confRestricaoPtovtaDataList.addItemNovo(ptovta);
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfRestricaoCanalVentaController.MSG.restricaoPtovtaJaCadastrada"),
						Labels.getLabel("editarConfRestricaoCanalVentaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
			
		} else {
			Messagebox.show(
					Labels.getLabel("editarConfRestricaoCanalVentaController.MSG.restricaoPtovta"),
					Labels.getLabel("editarConfRestricaoCanalVentaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
	}

	public void onClick$btnRemoveRestricaoPtovta(Event ev) throws InterruptedException {
		ConfRestricaoPtovta rPtovta = (ConfRestricaoPtovta) confRestricaoPtovtaDataList.getSelected();
		if (rPtovta != null) {
			confRestricaoPtovtaService.borrar(rPtovta);
			confRestricaoPtovtaDataList.removeItem(rPtovta);
		} else {
			Messagebox.show(
					Labels.getLabel("editarConfRestricaoCanalVentaController.MSG.selecionarrestricaoPtovta"),
					Labels.getLabel("editarConfRestricaoCanalVentaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
	}

	public void onClick$btnAdicionarExcecao(Event ev) throws InterruptedException {
		Date dataExcecao = dtExcecaoServicio.getValue();

		if (dataExcecao != null) {
			ConfRestricaoExcecao confRestricaoExcecao = new ConfRestricaoExcecao();
			confRestricaoExcecao.setFecExcecao(dataExcecao);
			confRestricaoExcecao.setConfRestricaoCanalVenta(confRestricaoCanalVenta);
			confRestricaoExcecao.setActivo(Boolean.TRUE);
			confRestricaoExcecao.setFecmodif(Calendar.getInstance().getTime());
			confRestricaoExcecao.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			if (confRestricaoCanalVenta.getLsConfRestricaoExcecao() == null) {
				confRestricaoCanalVenta.setLsConfRestricaoExcecao(new ArrayList<ConfRestricaoExcecao>());
			}
			confRestricaoCanalVenta.getLsConfRestricaoExcecao().add(confRestricaoExcecao);

			excecaoDataList.addItemNovo(confRestricaoExcecao);
			dtExcecaoServicio.setValue(null);
		} else {
			Messagebox.show(
					Labels.getLabel("editarConfRestricaoCanalVentaController.MSG.informaDataExcecao"),
					Labels.getLabel("editarConfRestricaoCanalVentaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
	}

	public void onClick$btnRemoverExcecao(Event ev) throws InterruptedException {
		ConfRestricaoExcecao confRestricaoExcecao = (ConfRestricaoExcecao) excecaoDataList.getSelected();
		if (confRestricaoExcecao != null) {
			confRestricaoExcecaoServide.borrar(confRestricaoExcecao);
			excecaoDataList.removeItem(confRestricaoExcecao);
		} else {
			Messagebox.show(
					Labels.getLabel("editarConfRestricaoCanalVentaController.MSG.selecionarExcecao"),
					Labels.getLabel("editarConfRestricaoCanalVentaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
	}
}
