/*
 * 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.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.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.api.Checkbox;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.Tarifa;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.TarifaEmbarcadaService;
import com.rjconsultores.ventaboletos.service.TarifaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

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

	private static final Short CAMBIAR_TARIFAS = 0;
	private static final Short COPIAR_TARIFAS = 1;
	private static final Short COPIAR_TARIFAS_EMBARCADAS = 2;

	private static final long serialVersionUID = 1L;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private TarifaService tarifaService;
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private TarifaEmbarcadaService tarifaEmbarcadaService;
	
	private List<VigenciaTarifa> lsVigenciaTarifa;
	private List<Empresa> lsEmpresa;

	private Combobox cmbVigencia;
	private Combobox cmbNovaVigencia;
	private Combobox cmbEmpresa;

	private Boolean excluirTarifas;
	private Radiogroup groupMoverCopiarTarifa;
	private Checkbox chkApagarTarifas;

	public Combobox getCmbNovaVigencia() {
		return cmbNovaVigencia;
	}

	public void setCmbNovaVigencia(Combobox cmbNovaVigencia) {
		this.cmbNovaVigencia = cmbNovaVigencia;
	}

	public Combobox getCmbVigencia() {
		return cmbVigencia;
	}

	public void setCmbVigencia(Combobox cmbVigencia) {
		this.cmbVigencia = cmbVigencia;
	}

	public List<VigenciaTarifa> getLsVigenciaTarifa() {
		return lsVigenciaTarifa;
	}

	public void setLsVigenciaTarifa(List<VigenciaTarifa> lsVigenciaTarifa) {
		this.lsVigenciaTarifa = lsVigenciaTarifa;
	}

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

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsVigenciaTarifa = vigenciaTarifaService.obtenerTodos();
		lsEmpresa = empresaService.obtenerTodosIncluindoEmpresaTodas();

		super.doAfterCompose(comp);
	}

	public void onCheck$groupMoverCopiarTarifa(Event ev) throws Exception {
		if (groupMoverCopiarTarifa.getSelectedIndex() == COPIAR_TARIFAS || groupMoverCopiarTarifa.getSelectedIndex() == COPIAR_TARIFAS_EMBARCADAS) {
			chkApagarTarifas.setVisible(true);
		} else {
			chkApagarTarifas.setChecked(false);
			chkApagarTarifas.setVisible(false);
		}
	}

	public void onClick$btnExecutar(Event ev) throws Exception {
		if (groupMoverCopiarTarifa.getSelectedIndex() == CAMBIAR_TARIFAS) {
			cambiarVigencia();
		} else if (groupMoverCopiarTarifa.getSelectedIndex() == COPIAR_TARIFAS) {
			copiarVigencia(false);
		} else {
			copiarVigencia(true);
		}
	}

	private void cambiarVigencia() throws InterruptedException {
		cmbVigencia.getSelectedItem();
		cmbNovaVigencia.getSelectedItem();

		VigenciaTarifa vigencia = (VigenciaTarifa) (cmbVigencia.getSelectedItem() != null ? cmbVigencia.getSelectedItem().getValue() : null);
		VigenciaTarifa novaVigencia = (VigenciaTarifa) (cmbNovaVigencia.getSelectedItem() != null ? cmbNovaVigencia.getSelectedItem().getValue() : null);
		Empresa empresa = (Empresa) (cmbEmpresa.getSelectedItem() != null ? cmbEmpresa.getSelectedItem().getValue() : null);

		List<Tarifa> lsTarifas = tarifaService.buscarPorVigencia(vigencia, empresa);

		String msg = lsTarifas.size() + " tarifas. Vigencia " + vigencia + " -> " + novaVigencia;

		Integer opcao = Messagebox.show(msg + ". "
				+ Labels.getLabel("cambioVigenciaController.MSGCambiarVigencias"),
				Labels.getLabel("cambioVigenciaController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (opcao.equals(Messagebox.YES)) {
			for (Tarifa tf : lsTarifas) {
				tf.setVigenciaTarifa(novaVigencia);
				Marca marca = tf.getMarca();
				Tramo tramo = tf.getTramo();
				Moneda moneda = tf.getMoneda();
				ClaseServicio claseServicio = tf.getClaseServicio();
				Ruta ruta = tf.getRuta();
				OrgaoConcedente orgaoConcedente = tf.getOrgaoConcedente();

				boolean existe = tarifaService.existe(marca, tramo, moneda, claseServicio, novaVigencia, ruta, orgaoConcedente);
				if (!existe) {
					tarifaService.actualizacion(tf);
				}
			}
		}

		Messagebox.show(
				Labels.getLabel("cambioVigenciaController.MSGCambiarSucesso"),
				Labels.getLabel("cambioVigenciaController.window.title"),
				Messagebox.OK, Messagebox.INFORMATION);

		closeWindow();

	}

	private void copiarVigencia(boolean embarcada) throws InterruptedException {
		cmbVigencia.getSelectedItem();
		cmbNovaVigencia.getSelectedItem();

		VigenciaTarifa vigenciaOrigem = (VigenciaTarifa) (cmbVigencia.getSelectedItem() != null ? cmbVigencia.getSelectedItem().getValue() : null);
		VigenciaTarifa vigenciaDestino = (VigenciaTarifa) (cmbNovaVigencia.getSelectedItem() != null ? cmbNovaVigencia.getSelectedItem().getValue() : null);
		Empresa empresa = (Empresa) (cmbEmpresa.getSelectedItem() != null ? cmbEmpresa.getSelectedItem().getValue() : null);

		if (vigenciaOrigem == vigenciaDestino) {
			Messagebox.show(Labels.getLabel("cambioVigenciaController.MSGMesmaVigencias"),
					Labels.getLabel("cambioVigenciaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		if (!tarifaService.existeTarifas(vigenciaOrigem)) {
			Messagebox.show(Labels.getLabel("cambioVigenciaController.MSGNingunaVigencias"),
					Labels.getLabel("cambioVigenciaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		} else {

			try {
				excluirTarifas = chkApagarTarifas.isChecked();
				if (embarcada) {
					tarifaEmbarcadaService.copiarTarifas(vigenciaOrigem, vigenciaDestino, empresa, excluirTarifas);
				} else {
					tarifaService.copiarTarifas(vigenciaOrigem, vigenciaDestino, empresa, excluirTarifas);
				}
				Messagebox.show(Labels.getLabel("cambioVigenciaController.MSGCopiarSucesso"),
						Labels.getLabel("cambioVigenciaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				closeWindow();

			} catch (BusinessException e) {
				Messagebox.show(Labels.getLabel("cambioVigenciaController.MSGCopiarSucesso"),
						Labels.getLabel("cambioVigenciaController.window.title"),
						Messagebox.OK, Messagebox.ERROR);
			}
		}
	}
}
