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

import java.math.BigDecimal;
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.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.AgrupamentoParada;
import com.rjconsultores.ventaboletos.entidad.Ciudad;
import com.rjconsultores.ventaboletos.entidad.ImpresionLayoutConfig;
import com.rjconsultores.ventaboletos.entidad.Nodo;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.ParadaCodOrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.TipoParada;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.AgruparParadaService;
import com.rjconsultores.ventaboletos.service.NodoService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.ParadaCodOrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.TipoParadaService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
import com.rjconsultores.ventaboletos.utilerias.RegistroConDependenciaException;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxCiudad;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxImpresionLayoutConfig;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderParadaCodOrgaoConcedente;

/**
 *
 * @author Rafius
 */
@Controller("editarCatalogoDeParadaController")
@Scope("prototype")
public class EditarCatalogoDeParadaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	@Autowired
	private ParadaService paradaService;
	@Autowired
	private TipoParadaService tipoParadaService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	@Autowired
	private ParadaCodOrgaoConcedenteService paradaCodOrgaoConcedenteService;
	@Autowired
	private NodoService nodoService;
	@Autowired
	private AgruparParadaService agruparParadaService;
	private Parada parada;
	private MyListbox paradaList;
	private static Logger log = LogManager.getLogger(EditarCatalogoDeParadaController.class);
	private Textbox txtNome;
	private Textbox cveparada;
	private MyComboboxCiudad cmbCiudad;
	private Combobox cmbTipoParada;
	private Textbox txtCodOrgaoConcedente;
	private Combobox cmbOrgaoConcedente;
	private MyListbox codOrgaosConcedentesList;
	private Checkbox chkVendeTotem;
	private Checkbox chkVendeInternet;
	private Checkbox chkIntegracaoW2i;
	private Checkbox chkDisponibleTotalbus;
	private Combobox cmbAgruparParada;
	private MyComboboxImpresionLayoutConfig cmbImpresionLayoutConfig;
	
	private Textbox txtLatitude;
	private Textbox txtLongitude;

	private List<TipoParada> lsTipoParadas;
	private List<OrgaoConcedente> lsOrgaosConcedentes;
	private List<AgrupamentoParada> lsAgrupamentoParada;
	private List<Nodo> lsNodo;
	private Button btnApagar;
	private Intbox codAntt;
	private Textbox descProcon;

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

		parada = (Parada) Executions.getCurrent().getArg().get("parada");
		paradaList = (MyListbox) Executions.getCurrent().getArg().get("paradaList");

		codOrgaosConcedentesList.setItemRenderer(new RenderParadaCodOrgaoConcedente());
		codOrgaosConcedentesList.setData(parada.getCodigosOrgaosConcedentes());
		lsTipoParadas = tipoParadaService.obtenerTodos();
		lsOrgaosConcedentes = orgaoConcedenteService.obtenerTodosExceto(-1,OrgaoConcedente.CODIGO_ANTT);
		lsAgrupamentoParada = agruparParadaService.obtenerTodos();
		
		if (parada.getParadaId() == null) {
			chkVendeTotem.setChecked(true);
		} else {
			chkVendeTotem.setChecked(parada.getIndVendeTotem() == null ? false : parada.getIndVendeTotem());
		}

		chkVendeInternet.setChecked(parada.getIndVisibleInternet() == null ? false : parada.getIndVisibleInternet());

		chkIntegracaoW2i.setChecked(parada.getIndIntegracaoW2i());
		chkDisponibleTotalbus.setChecked(parada.getIndDisponibleTotalBus() == null ? true : parada.getIndDisponibleTotalBus());
		
		lsNodo = nodoService.obtenerTodos();

		if (parada.getParadaId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		} else {
			Ciudad ciudad = parada.getCiudad();
			if (ciudad != null) {
				cmbCiudad.setText(ciudad.toString());
			}
			cmbImpresionLayoutConfig.setInitialValue(parada.getImpresionLayoutConfig());
		}
		
		if (parada.getLatitude() != null) {
			txtLatitude.setValue(parada.getLatitude().toString());			
		}
		
		if (parada.getLongitude() != null ) {
			txtLongitude.setValue(parada.getLongitude().toString());
		}

		if (ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.COD_ANTT_NAO_OBRIGATORIO.getDescricao())) {
			codAntt.setConstraint("");
		}

		txtNome.focus();
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		txtNome.getValue();
		cveparada.getValue();
		cmbCiudad.getValue();
		cmbTipoParada.getValue();
		cmbAgruparParada.getValue();
		codAntt.getValue();
		descProcon.getValue();
		txtLatitude.getValue();
		txtLongitude.getValue();

		if (!validaNome()){
			Messagebox.show(
					Labels.getLabel("editarCatalogoDeParadaController.MSG.nomeInvalido"),
					Labels.getLabel("editarCatalogoDeParadaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		
		if (!validarLatitudeLongitude()) {
			Messagebox.show(
					Labels.getLabel("editarCatalogoDeParadaController.MSG.latitudeLongitude"),
					Labels.getLabel("editarCatalogoDeParadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;			
		}

		try {
			Nodo nodoCentral = lsNodo.get(0);
			parada.setNodo(nodoCentral);
			parada.setIndVendeTotem(chkVendeTotem.isChecked());
			parada.setIndVisibleInternet(chkVendeInternet.isChecked());
			parada.setIndIntegracaoW2i(chkIntegracaoW2i.isChecked());
			parada.setIndDisponibleTotalBus(chkDisponibleTotalbus.isChecked());
			
			parada.setLatitude(null);
			if (StringUtils.isNotBlank(txtLatitude.getValue())) {
				parada.setLatitude(new BigDecimal(txtLatitude.getValue()));
			}
			
			parada.setLongitude(null);
			if (StringUtils.isNotBlank(txtLongitude.getValue())) {
				parada.setLongitude(new BigDecimal(txtLongitude.getValue()));
			}
			
			Comboitem cbImpresionLayoutConfig = cmbImpresionLayoutConfig.getSelectedItem();
			parada.setImpresionLayoutConfig(null);
			if (cbImpresionLayoutConfig != null) {
				parada.setImpresionLayoutConfig((ImpresionLayoutConfig) cbImpresionLayoutConfig.getValue());
			}
			
			if("".equals(cmbAgruparParada.getValue())){
				parada.setAgrupamentoParada(null);
			}

			cmbCiudad.getValue(parada.getParadaId() == null);
			paradaService.suscribirActualizar(parada);

			paradaList.updateItem(parada);

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

			closeWindow();
		} catch (BusinessException ex) {
			Messagebox.show(
					ex.getLocalizedMessage(),
					Labels.getLabel("editarCatalogoDeParadaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

		}
	}

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

			if (resp == Messagebox.YES) {

				paradaService.borrar(parada);

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

				paradaList.removeItem(parada);

				closeWindow();
			}
		} catch (RegistroConDependenciaException ex) {
			Clients.alert(
					ex.getLocalizedMessage(),
					Labels.getLabel("editarCatalogoDeParadaController.window.title"),
					Messagebox.INFORMATION);
		} catch (Exception ex) {
			log.error(ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeParadaController.window.title"),
					Messagebox.INFORMATION);
		}
	}

	public void onClick$btnAdicionarCodOrgaoConcedente(Event ev) throws InterruptedException {
		ParadaCodOrgaoConcedente codigo = new ParadaCodOrgaoConcedente();
		codigo.setCodigo(txtCodOrgaoConcedente.getText());
		codigo.setOrgaoConcedente((OrgaoConcedente)cmbOrgaoConcedente.getSelectedItem().getValue());
		codigo.setParada(parada);
		parada.addCodOrgaoConcedente(codigo);
		codOrgaosConcedentesList.setData(parada.getCodigosOrgaosConcedentes());
	}

	public void onClick$btnRemoverCodOrgaoConcedente(Event ev) throws InterruptedException {
		try {
			if(codOrgaosConcedentesList.getSelected() != null) {
				int resp = Messagebox.show(
						Labels.getLabel("editarCatalogoDeParadaController.MSG.borrarCodigoOrgaoConcedentePergunta"),
						Labels.getLabel("editarCatalogoDeParadaController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

				if (resp == Messagebox.YES) {
					ParadaCodOrgaoConcedente codigo = (ParadaCodOrgaoConcedente) codOrgaosConcedentesList.getSelected();
					parada.removeCodOrgaoConcedente(codigo);
					codOrgaosConcedentesList.removeItem(codigo);
					paradaCodOrgaoConcedenteService.borrar(codigo);
		            Messagebox.show(Labels.getLabel("editarCatalogoDeParadaController.msg.borrarCodigoOrgaoConcedenteOk"),
		    				Labels.getLabel("editarCatalogoDeParadaController.window.title"),
		    				Messagebox.OK,Messagebox.INFORMATION);
				}
			}

		} catch (Exception e) {
			log.error(e.getMessage(), e);
		    Messagebox.show(Labels.getLabel("MSG.Error"),
		    				Labels.getLabel("editarCatalogoDeParadaController.window.title"),
		    				Messagebox.OK,Messagebox.ERROR);
		}
	}

	public List<Nodo> getLsNodo() {
		return lsNodo;
	}

	public void setLsNodo(List<Nodo> lsNodo) {
		this.lsNodo = lsNodo;
	}

	public List<TipoParada> getLsTipoParadas() {
		return lsTipoParadas;
	}

	public void setLsTipoParadas(List<TipoParada> lsTipoParadas) {
		this.lsTipoParadas = lsTipoParadas;
	}


	public List<OrgaoConcedente> getLsOrgaosConcedentes() {
		return lsOrgaosConcedentes;
	}

	public void setLsOrgaosConcedentes(List<OrgaoConcedente> lsOrgaosConcedentes) {
		this.lsOrgaosConcedentes = lsOrgaosConcedentes;
	}

	public Parada getParada() {
		return parada;
	}

	public void setParada(Parada parada) {
		this.parada = parada;
	}
	
	

	public List<AgrupamentoParada> getLsAgrupamentoParada() {
		return lsAgrupamentoParada;
	}

	public void setLsAgrupamentoParada(List<AgrupamentoParada> lsAgrupamentoParada) {
		this.lsAgrupamentoParada = lsAgrupamentoParada;
	}

	public boolean validaNome(){
		if (!ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.VALIDA_ESTADO_NO_NOME_LOCALIDADE.getDescricao())){
			return true;
		}
		boolean isValid = false;
		for (EstadosBrasilEnum e : EstadosBrasilEnum.values()) {
			if (txtNome.getValue().contains("- " + e.toString())){
				isValid = true;
				break;
			}
		}
		return isValid;
	}
	public enum EstadosBrasilEnum {
		 AC, // Acre
		 AL, // Alagoas
		 AP, // Amapá
		 AM, // Amazonas
		 BA, // Bahia
		 CE, // Ceará
		 DF, // Distrito Federal
		 ES, // Espirito Santo
		 GO, // Goiás
		 MA, // Maranhão
		 MT, // Mato Grosso
		 MS, // Mato Grosso do Sul
		 MG, // Minas Gerais
		 PA, // Pará
		 PB, // Paraíba
		 PR, // Paraná
		 PE, // Pernambuco
		 PI, // Piauí
		 RR, // Roraima
		 RO, // Rondônia
		 RJ, // Rio de Janeiro
		 RN, // Rio Grande do Norte
		 RS, // Rio Grande do Sul
		 SC, // Santa Catarina
		 SP, // são Paulo
		 SE, // Sergipe
		 TO // Tocantins
		}
	
	public boolean validarLatitudeLongitude() {
		try {
			
			String latitude = txtLatitude.getValue();
			if (StringUtils.isNotBlank(latitude)) {
				new BigDecimal(latitude);				
			}
			
			String longitude = txtLongitude.getValue();
			if (StringUtils.isNotBlank(longitude)){
				new BigDecimal(longitude);			
			}
			
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
}
