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

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.BooleanUtils;
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.zkplus.databind.BindingListModel;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Ciudad;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.InscricaoEstadual;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.CiudadService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;

/**
 * @author Valdir Cordeiro <valdir@rjconsultores.com.br>
 * 
 *         28 de mai de 2018
 */
@Controller("EditarEmpresaInscricaoEstadualController")
@Scope("prototype")
public class EditarEmpresaInscricaoEstadualController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@SuppressWarnings("unused")
	private static Logger log = LogManager.getLogger(EditarEmpresaInscricaoEstadualController.class);

	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private CiudadService ciudadService;
	@Autowired
	private EstadoService estadoService;

	private InscricaoEstadual inscricaoEstadual;

	private MyListbox inscEstadualList;
	private MyTextbox txtNumInscricaoMunicipal;
	private Combobox cmbEstadoInscEstadual;
	private MyTextbox txtInscEstadual;

	private Combobox cmbInscEstCidade;
	private Textbox txtInscEstCNPJ;
	private Textbox txtInscEstLogradouro;
	private Textbox txtInscEstNumero;
	private Textbox txtInscEstComplemento;
	private Textbox txtInscEstCEP;
	private Textbox txtInscEstBairro;
	private Textbox txtEquivalenciaAG;
	private Checkbox chkBPe;
	private Checkbox chkFormaPagoOutrosSemDadosCartao;
	private Checkbox chkHabilitaIEDescentralizada;
	private Checkbox ckIsento;
	private MyComboboxParada cmbOrigemIEDescentralizada;	

	private List<Ciudad> lsCidades;
	private List<Estado> lsEstados;
	private List<Estado> lsTodosEstados;

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

		inscricaoEstadual = (InscricaoEstadual) Executions.getCurrent().getArg().get("inscricaoEstadual");

		this.inscEstadualList = (MyListbox) Executions.getCurrent().getArg().get("inscEstadualList");

		lsTodosEstados = estadoService.obtenerTodos();

		lsCidades = new ArrayList<Ciudad>();

		super.doAfterCompose(comp);

		if (inscricaoEstadual != null) {
			alterarCidade(inscricaoEstadual.getEstado());
			chkFormaPagoOutrosSemDadosCartao.setChecked(BooleanUtils.toBoolean(inscricaoEstadual.getIndFormaPagoOutrosSemCartao()));
			chkBPe.setChecked(BooleanUtils.toBoolean(inscricaoEstadual.getIsBPe()));
			chkHabilitaIEDescentralizada.setChecked(BooleanUtils.toBoolean(inscricaoEstadual.getIndHabilitaIEDescentralizada()));
			if(inscricaoEstadual.getNumInscricaoMunicipal().equalsIgnoreCase("ISENTO")) {
				txtNumInscricaoMunicipal.setValue("ISENTO");
				txtNumInscricaoMunicipal.setDisabled(true);
				ckIsento.setChecked(true);
			}else {
				txtNumInscricaoMunicipal.setValue(inscricaoEstadual.getNumInscricaoMunicipal());				
			}
		}

	}

	public void onChange$cmbEstadoInscEstadual(Event ev) {
		Comboitem cbiEstado = cmbEstadoInscEstadual.getSelectedItem();
		if (cbiEstado != null) {
			Estado estado = (Estado) cbiEstado.getValue();

			alterarCidade(estado);
		}
	}

	private void alterarCidade(Estado estado) {
		if (estado != null) {
			lsCidades = new ArrayList<Ciudad>();
			lsCidades.addAll(ciudadService.buscarPorEstado(estado));
			BindingListModel listModelCiudad = new BindingListModelList(lsCidades, true);
			cmbInscEstCidade.setModel(listModelCiudad);
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException, BusinessException {
		Estado estado = (Estado) cmbEstadoInscEstadual.getSelectedItem().getValue();
		
		Boolean isHabilitaIEDescentralizada = chkHabilitaIEDescentralizada.isChecked();
		Parada origemIEDescentralizada = cmbOrigemIEDescentralizada.getSelectedObject();
		
		if(!validarCamposIEDescentralizada()) {
			return;
		}		

		for (int i = 0; i < inscEstadualList.getModel().getSize(); i++) {
			InscricaoEstadual inscricaoEstadual = (InscricaoEstadual) inscEstadualList.getModel().getElementAt(i);
			if(isHabilitaIEDescentralizada) {
				if (!inscricaoEstadual.equals(this.inscricaoEstadual) &&
					inscricaoEstadual.getEstado().equals(estado) &&
					origemIEDescentralizada.equals(inscricaoEstadual.getOrigemIEDescentralizada())) {
					Messagebox.show(
							Labels.getLabel("editarEmpresaController.MSG.origemIEDescentralizadaJaInformada", new String[] {origemIEDescentralizada.getDescparada(), inscricaoEstadual.getEstado().getNombestado()}),
							Labels.getLabel("editarPricingController.windowMarca.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return;
				}
			} else {			
				if (inscricaoEstadual.getEstado().equals(estado) && !inscricaoEstadual.equals(this.inscricaoEstadual)) {
					Messagebox.show(
							Labels.getLabel("editarEmpresaController.MSG.insEstadualCadastrada"),
							Labels.getLabel("editarPricingController.windowMarca.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return;
				}
			}
		}

		inscricaoEstadual.setIndHabilitaIEDescentralizada(isHabilitaIEDescentralizada);
		if(isHabilitaIEDescentralizada) {
			inscricaoEstadual.setOrigemIEDescentralizada(origemIEDescentralizada);
		} else {
			inscricaoEstadual.setOrigemIEDescentralizada(null);
		}
		
		inscricaoEstadual.setIndFormaPagoOutrosSemCartao(chkFormaPagoOutrosSemDadosCartao.isChecked());
		
		inscricaoEstadual.setIsBPe(chkBPe.isChecked());
		
		String inscricaoMunicipal=StringUtils.isBlank((txtNumInscricaoMunicipal.getValue()))?"ISENTO":txtNumInscricaoMunicipal.getValue();		
		inscricaoEstadual.setNumInscricaoMunicipal(inscricaoMunicipal);
		
		empresaService.actualizaInscEstadual(inscricaoEstadual);

		inscEstadualList.updateItem(inscricaoEstadual);

		closeWindow();
	}
	
	public void onClick$ckIsento(Event ev) {
		if (ckIsento.isChecked()) {			
			txtNumInscricaoMunicipal.setValue("ISENTO");
			txtNumInscricaoMunicipal.setDisabled(true);
		} else {			
			txtNumInscricaoMunicipal.setValue("");
			txtNumInscricaoMunicipal.setDisabled(false);
		}
	}

	private boolean validarCamposIEDescentralizada() throws InterruptedException {
		Boolean isHabilitaIEDescentralizada = chkHabilitaIEDescentralizada.isChecked();
		if(!isHabilitaIEDescentralizada) {
			return true;
		}
		
		Parada origemIEDescentralizada = cmbOrigemIEDescentralizada.getSelectedObject();
		if(origemIEDescentralizada == null) {
			Messagebox.show(
					Labels.getLabel("editarEmpresaController.MSG.origemIEDescentralizadaNaoInformada"),
					Labels.getLabel("editarPricingController.windowMarca.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);			
			return false;
		}
		
		Estado estado = (Estado) cmbEstadoInscEstadual.getSelectedItem().getValue();
		if(origemIEDescentralizada.getCiudad() == null ||
		   !origemIEDescentralizada.getCiudad().getEstado().equals(estado)) {
			Messagebox.show(
					Labels.getLabel("editarEmpresaController.MSG.origemIEDescentralizadaUFIncompativel"),
					Labels.getLabel("editarPricingController.windowMarca.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);			
			return false;
		}
		
		return true;
	}

	public List<Ciudad> getLsCidades() {
		return lsCidades;
	}

	public void setLsCidades(List<Ciudad> lsCidades) {
		this.lsCidades = lsCidades;
	}

	public List<Estado> getLsEstados() {
		return lsEstados;
	}

	public void setLsEstados(List<Estado> lsEstados) {
		this.lsEstados = lsEstados;
	}

	public List<Estado> getLsTodosEstados() {
		return lsTodosEstados;
	}

	public void setLsTodosEstados(List<Estado> lsTodosEstados) {
		this.lsTodosEstados = lsTodosEstados;
	}

	public InscricaoEstadual getInscricaoEstadual() {
		return inscricaoEstadual;
	}

	public void setInscricaoEstadual(InscricaoEstadual inscricaoEstadual) {
		this.inscricaoEstadual = inscricaoEstadual;
	}

	public MyListbox getInscEstadualList() {
		return inscEstadualList;
	}

	public void setInscEstadualList(MyListbox inscEstadualList) {
		this.inscEstadualList = inscEstadualList;
	}

	public Combobox getCmbEstadoInscEstadual() {
		return cmbEstadoInscEstadual;
	}

	public void setCmbEstadoInscEstadual(Combobox cmbEstadoInscEstadual) {
		this.cmbEstadoInscEstadual = cmbEstadoInscEstadual;
	}

	public MyTextbox getTxtInscEstadual() {
		return txtInscEstadual;
	}

	public void setTxtInscEstadual(MyTextbox txtInscEstadual) {
		this.txtInscEstadual = txtInscEstadual;
	}

	public Combobox getCmbInscEstCidade() {
		return cmbInscEstCidade;
	}

	public void setCmbInscEstCidade(Combobox cmbInscEstCidade) {
		this.cmbInscEstCidade = cmbInscEstCidade;
	}

	public Textbox getTxtInscEstCNPJ() {
		return txtInscEstCNPJ;
	}

	public void setTxtInscEstCNPJ(Textbox txtInscEstCNPJ) {
		this.txtInscEstCNPJ = txtInscEstCNPJ;
	}

	public Textbox getTxtInscEstLogradouro() {
		return txtInscEstLogradouro;
	}

	public void setTxtInscEstLogradouro(Textbox txtInscEstLogradouro) {
		this.txtInscEstLogradouro = txtInscEstLogradouro;
	}

	public Textbox getTxtInscEstNumero() {
		return txtInscEstNumero;
	}

	public void setTxtInscEstNumero(Textbox txtInscEstNumero) {
		this.txtInscEstNumero = txtInscEstNumero;
	}

	public Textbox getTxtInscEstComplemento() {
		return txtInscEstComplemento;
	}

	public void setTxtInscEstComplemento(Textbox txtInscEstComplemento) {
		this.txtInscEstComplemento = txtInscEstComplemento;
	}

	public Textbox getTxtInscEstCEP() {
		return txtInscEstCEP;
	}

	public void setTxtInscEstCEP(Textbox txtInscEstCEP) {
		this.txtInscEstCEP = txtInscEstCEP;
	}

	public Textbox getTxtInscEstBairro() {
		return txtInscEstBairro;
	}

	public void setTxtInscEstBairro(Textbox txtInscEstBairro) {
		this.txtInscEstBairro = txtInscEstBairro;
	}

	public Textbox getTxtEquivalenciaAG() {
		return txtEquivalenciaAG;
	}

	public void setTxtEquivalenciaAG(Textbox txtEquivalenciaAG) {
		this.txtEquivalenciaAG = txtEquivalenciaAG;
	}

	public Checkbox getChkBPe() {
		return chkBPe;
	}

	public void setChkBPe(Checkbox chkBPe) {
		this.chkBPe = chkBPe;
	}
	
	public Boolean getHabilitaIEDescentralizada() {
		return ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.IS_HABILITA_IE_DESCENTRALIZADA.getDescricao());
	}
	
}
