/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.tarifas;

import java.util.Calendar;
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.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Button;
import org.zkoss.zul.Datebox;

import com.rjconsultores.ventaboletos.entidad.Tarifa;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.service.TarifaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;

/**
 *
 * @author rodrigo
 */
@Controller("editarVigenciaTarifaController")
@Scope("prototype")
public class EditarVigenciaTarifaController extends MyGenericForwardComposer {

	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private TarifaService tarifaService;
	private VigenciaTarifa vigenciaTarifa;
	private MyListbox vigenciaList;
	private Button btnApagar;
	private Datebox fecInicio;
	private Datebox fecFinal;
	private Datebox fecVenta;
	private static final Logger log = LogManager.getLogger(EditarVigenciaTarifaController.class);

	public MyListbox getVigenciaList() {
		return vigenciaList;
	}

	public void setVigenciaList(MyListbox vigenciaList) {
		this.vigenciaList = vigenciaList;
	}

	public VigenciaTarifa getVigenciaTarifa() {
		return vigenciaTarifa;
	}

	public void setVigenciaTarifa(VigenciaTarifa vigenciaTarifa) {
		this.vigenciaTarifa = vigenciaTarifa;
	}

	public Button getBtnApagar() {
		return btnApagar;
	}

	public void setBtnApagar(Button btnApagar) {
		this.btnApagar = btnApagar;
	}

	public Datebox getFecInicio() {
		return fecInicio;
	}

	public void setFecInicio(Datebox fecInicio) {
		this.fecInicio = fecInicio;
	}

	public Datebox getFecFinal() {
		return fecFinal;
	}

	public void setFecFinal(Datebox fecFinal) {
		this.fecFinal = fecFinal;
	}

	public Datebox getFecVenta() {
		return fecVenta;
	}

	public void setFecVenta(Datebox fecVenta) {
		this.fecVenta = fecVenta;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		vigenciaTarifa = (VigenciaTarifa) Executions.getCurrent().getArg().get("vigenciaTarifa");
		vigenciaList = (MyListbox) Executions.getCurrent().getArg().get("vigenciaList");

		if (vigenciaTarifa.getVigenciatarifaId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		}

		fecInicio.focus();
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		Date inicio = fecInicio.getValue();
		Date fim = fecFinal.getValue();

		if (!fim.before(inicio)) {
			vigenciaTarifa.setFeciniciovigencia(DateUtil.inicioFecha(inicio));
			vigenciaTarifa.setFecfinvigencia(DateUtil.fimFecha(fim));

			// Nao traga ela mesma se em edicao
			List<VigenciaTarifa> lsVigencias = vigenciaTarifaService.buscarVigenciasIntervalo(vigenciaTarifa);

			// Nova Tarifa ou em edicao e sem conflitos
			if ((lsVigencias.isEmpty() && vigenciaTarifa.getVigenciatarifaId() == null)
					|| (lsVigencias.isEmpty() && vigenciaTarifa.getVigenciatarifaId() != null)) {

				salvarVigencia();
			} else {
				StringBuilder msgConflito = new StringBuilder(Labels.getLabel("editarVigenciaTarifaController.MSG.conflitoVigencias"));
				msgConflito.append(". ");
				VigenciaTarifa vigenciaBase = lsVigencias.get(0);

				if (vigenciaTarifa.getFeciniciovigencia().equals(vigenciaBase.getFeciniciovigencia())) {
					Messagebox.show(getMsgDataInicioIgual(msgConflito, vigenciaBase));
					return;
				}

				Boolean indDataInicialConflitante = indDataInicialConflitante(vigenciaBase, msgConflito);
				if (indDataInicialConflitante && lsVigencias.size() > 1) {
					VigenciaTarifa vigenciaPosterior = lsVigencias.get(1);
					setDataFinalAntesVigenciaParam(vigenciaPosterior, msgConflito);
				}

				msgConflito.append("\n");
				msgConflito.append(Labels.getLabel("editarVigenciaTarifaController.MSG.continuar"));
				int opcao = Messagebox.show(msgConflito.toString(), "", Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION);

				if (opcao == Messagebox.OK) {
					salvarVigencia();
					if (indDataInicialConflitante) {
						atualizarItem(vigenciaBase);
					}
				}
			}
		} else {
			Messagebox.show(
					Labels.getLabel("editarVigenciaTarifaController.MSG.FimMenorInicio"),
					Labels.getLabel("editarVigenciaTarifaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

	private Boolean indDataInicialConflitante(VigenciaTarifa vigenciaBase, StringBuilder msgConflito) {

		if (vigenciaTarifa.getFeciniciovigencia().before(vigenciaBase.getFeciniciovigencia())) {
			// Apenas data final eh conflitante...
			// Reduzir a data final da nova vigencia para um dia anterior
			// a data inicial da vigencia conflitante(Posterior, a entrar em vigencia)

			setDataFinalAntesVigenciaParam(vigenciaBase, msgConflito);
			return false;

		} else {
			// Nova vigencia tem data inicial conflitante mas nao igual
			// a data inicial da vigencia conflitante(Anteriormente em vigencia)...
			// Reduza a data final da vigencia conflitante para um dia anterior a nova vigencia (tire sua vigencia)

			vigenciaBase.setFecfinvigencia(DateUtil.somarMinutos(vigenciaTarifa.getFeciniciovigencia(), -1));
			setMsgDataInicioConflitante(msgConflito, vigenciaBase);
			return true;
		}
	}

	private void setDataFinalAntesVigenciaParam(VigenciaTarifa vigenciaBase, StringBuilder msgConflito) {
		vigenciaTarifa.setFecfinvigencia(DateUtil.somarMinutos(vigenciaBase.getFeciniciovigencia(), -1));
		setMegDataFinalConflitante(msgConflito);
	}

	private void setMsgDataInicioConflitante(StringBuilder msgConflito, VigenciaTarifa vigenciaBase) {
		msgConflito.append(" ");
		msgConflito.append(Labels.getLabel("editarVigenciaTarifaController.MSG.dataInicialConflitante"));
		msgConflito.append(" ");
		msgConflito.append(DateUtil.getStringDate(vigenciaBase.getFecfinvigencia(), DateUtil.ddMMaaHHmm));
		msgConflito.append(". ");
	}

	private void setMegDataFinalConflitante(StringBuilder msgConflito) {
		msgConflito.append(" ");
		msgConflito.append(Labels.getLabel("editarVigenciaTarifaController.MSG.dataFinalConflitante"));
		msgConflito.append(" ");
		msgConflito.append(DateUtil.getStringDate(vigenciaTarifa.getFecfinvigencia(), DateUtil.ddMMaaHHmm));
		msgConflito.append(". ");
	}

	private String getMsgDataInicioIgual(StringBuilder msgConflito, VigenciaTarifa vigenciaBase) {
		msgConflito.append(Labels.getLabel("editarVigenciaTarifaController.MSG.dataInicialIgual"));
		msgConflito.append(" ");
		msgConflito.append(vigenciaBase.getVigenciatarifaId());
		return msgConflito.toString();
	}

	private void salvarVigencia() throws InterruptedException {
		if (vigenciaTarifa.getVigenciatarifaId() == null) {
			salvarItemNovo();
		} else {
			atualizarItem(vigenciaTarifa);
		}
	}

	private void atualizarItem(VigenciaTarifa vigencia) throws InterruptedException {
		vigenciaTarifaService.actualizacion(vigencia);
		vigenciaList.updateItem(vigencia);

		Messagebox.show(
				Labels.getLabel("editarVigenciaTarifaController.btnFechar.MSG.SuscbrirOK"),
				Labels.getLabel("editarVigenciaTarifaController.window.title"),
				Messagebox.OK, Messagebox.INFORMATION);

		closeWindow();

	}

	private void salvarItemNovo() throws InterruptedException {
		vigenciaTarifaService.suscribir(vigenciaTarifa);
		vigenciaList.addItemNovo(vigenciaTarifa);

		Messagebox.show(
				Labels.getLabel("editarVigenciaTarifaController.btnFechar.MSG.SuscbrirOK"),
				Labels.getLabel("editarVigenciaTarifaController.window.title"),
				Messagebox.OK, Messagebox.INFORMATION);

		closeWindow();

	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		vigenciaTarifa.setFecmodif(Calendar.getInstance().getTime());
		vigenciaTarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		vigenciaTarifa.setActivo(Boolean.FALSE);

		int opcao = Messagebox.show(
				Labels.getLabel("editarVigenciaTarifaController.btnFechar.MSG.Deseja.Borrar"),
				Labels.getLabel("editarVigenciaTarifaController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (opcao == Messagebox.YES) {

			// Nao posso eliminar uma vigencia se existir tarifa!!!
			List<Tarifa> tarifa = tarifaService.buscarExisteVigencia(vigenciaTarifa);
			if (!tarifa.isEmpty()) {
				Messagebox.show(
						Labels.getLabel("editarVigenciaTarifaController.MSG.podeApagar"),
						Labels.getLabel("editarVigenciaTarifaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			} else {
				vigenciaTarifaService.borrar(vigenciaTarifa);
				vigenciaList.removeItem(vigenciaTarifa);

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

				closeWindow();
			}
		}
	}
}
